高手请进,来者有分:VC中的automation中的问题。

msgsnd 2003-11-21 04:35:57
http://expert.csdn.net/Expert/TopicView2.asp?id=2479147&datebasetype=now
这个贴子我已经结了,在开一贴。我的问题是:
我需要读一个文件,处理后,返回处理后的结果,因此需要返回byte[];
我用的是MFC支持的dll,创建类后,在automation中加入方法,但这试没办法设置返回类型为byte[],因为vc提供的返回参数的下拉列表框中没有这种类型,仅有简单类型、VARIANT、LPUNKNOWN、LPDISPATCH等类型。
请问高手怎麽办?
还有,如果有办法返回,但客户怎麽获知数组长度。
我将在开铁加分的。
...全文
44 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
msgsnd 2003-11-24
  • 打赏
  • 举报
回复
欢迎继续发表看法。
guzhenghong 2003-11-22
  • 打赏
  • 举报
回复
我同意 LOP 的方法
msgsnd 2003-11-22
  • 打赏
  • 举报
回复
感谢各位的帮助。问题解决立即结贴。
lop5712 2003-11-22
  • 打赏
  • 举报
回复
COleSafeArray content;
ABCD( &content );
unsigned char *pContent = NULL;
content.AccessData( reinterpret_cast< void** >( &pContent ) );
// 使用pContent,如:考到缓冲区pBuffer;
unsigned char *pBuffer = new unsigned char[ content.GetOneDimSize() ];
if( pBuffer )
memcpy( pBuffer, pContent, content.GetOneDimSize() );
content.UnaccessData();

这种方法效率很低(如果还考到缓冲区中,则两次copy数据,如果内容多将是严重的瓶颈),如果数据长度太长应使用异步调用。
zhouxj 2003-11-21
  • 打赏
  • 举报
回复
学习学习!
lop5712 2003-11-21
  • 打赏
  • 举报
回复
使用SAFEARRAY,不过用VARIANT*作为参数,如下:

HREUSLT ABCD( VARIANT *pVar )
{
if( !pVar )
return E_POINTER;

COleSafeArray temp;
temp.CreateOneDim( VT_UI1,
欲返回的数据的字节长度,
欲返回的数据的指针,
欲返回的数据的字节长度 );
::VariantCopy( adf, &temp );

return S_OK;
}
warmchang 2003-11-21
  • 打赏
  • 举报
回复
VARIANT即可。楼上的方法试试。
Azusa 2003-11-21
  • 打赏
  • 举报
回复
转成VARIANT类型, VARIANT类型可以是一个数组. 每个数组元素又是一个VARIANT,这时VARIANT是一个byte.
istone 2003-11-21
  • 打赏
  • 举报
回复
学习
msgsnd 2003-11-21
  • 打赏
  • 举报
回复
就是做一个dll,然后在iis里调用。我需要这麽一个函数得到处理后的数据。
mfc168 2003-11-21
  • 打赏
  • 举报
回复
如果只是简单的读文件处理的话,没有必要选择LPUNKNOWN这些类型,你是想做COM接口?还是OCX?
msgsnd 2003-11-21
  • 打赏
  • 举报
回复
我尝试用LPUNKNOWN把byte*强自转换为LPUNKNOWN,但客户端无法转换回来。我怀疑LPUNKNOWN指向的应当是接口指针。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧