描述:
我用COM对一个DLL进行了封装,此DLL是用来调用扫描仪进行文件扫描并抓取所扫描的文件影像,从DLL中返回的是一个指向内存区域内的文件影像的void*类型指针。在COM接口中要将此void*类型的指针进行封装,返回给调用此COM的C#程序,现在的问题是在COM接口中,我应该将此void*类型指针封装成什么类型的返回值?如何实现?
各位大拿,请不吝赐教,问题解决,再加分!
解决方案1:
VARIANT
解决方案2: 我估计你的文件其实是按照字节来存储的,DLL返回的是起始地址,那么只要知道数据的长度就OK了,用内存拷贝吧memset,当然也可以用ATL的专用拷贝函数,呵呵,估计你要看看COM方面的书了,返回也可以做成数组BYTE[]。我都好久没有写COM,忘了好多,给你个例子:传入一个ARRAY,返回数组:你可以在这一栏搜搜,关键字“数组”,看看别人的帖子吧:
[id(1), helpstring("method ExpectArray")] HRESULT ExpectArray([in] VARIANT varArray,[out,retval]BSTR* outstr);
STDMETHODIMP CArrayTest::ExpectArray(VARIANT pvarArray,BSTR* outstr)
{
// accepte array from vbscript
_bstr_t bstmp;
VARIANT* varArray;
if(pvarArray.vt==(VT_VARIANT|VT_BYREF))
{
varArray = pvarArray.pvarVal;
}
else
varArray = &pvarArray;
if(VT_ARRAY|VT_BYREF|VT_VARIANT==varArray->vt)
{
VARIANT* strarray;
SAFEARRAY* psa = *(varArray->pparray);
//SafeArrayCopy( *(varArray->pparray),&psa);
SafeArrayAccessData(psa,(void**)&strarray);
UINT uDim = SafeArrayGetDim(psa);
if(uDim==1)
{
long lLbound,lRbound;
SafeArrayGetLBound(psa,1,&lLbound);
SafeArrayGetUBound(psa,1,&lRbound);
for(long i=lLbound;i<=lRbound;i++)
{
if(strarray[i].vt==VT_BSTR)
bstmp +=strarray[i].bstrVal;
else if(strarray[i].vt==VT_EMPTY)
{
char buf[64];
wsprintf(buf,"element%d is empty",i);
bstmp +=buf;
}
}
}
else
bstmp = "wrong dimension number";
SafeArrayUnaccessData(psa);
}
*outstr = bstmp.copy();
return S_OK;
}
估计你要转换城确定类型的数据,比如字符串。接口可以设计成 HRESULT Process([out,retval]BSTR* bstrData)
解决方案4:顶
解决方案5:UP
解决方案6:
如果真的只是要传一个指针,随便用long传都行。
问题是,客户端程序拿到的这个指针能用么?
这个“指向内存区域内的文件影像的void*类型指针”到底是如何实现的?
在C#中支持么?