关于COM接口编程的一点问题

由于项目中要用到COM组件,而且可能涉及到字符串及数组传输。下面将一一来讲解:

1、字符串string或CString的转换

由于COM组件使用的是BSTR,因此有必要在使用的时候将其转换为BSTR:
string str=“abcdefg”;
BSTR bstr = A2BSTR(str.c_str());

CString cstr = L"0123456";
BSTR bstr = str.AllocSysString();
然后再COM里使用的时候就可以使用bstr了

2、传输数组

由于COM组件里没有传输数组功能,推荐http://blog.csdn.net/joe_wang/article/details/5616211,可以借鉴。

3、VARIANT传值问题

接下来是本人的经验,可能有失当之处,请高手指正。
函数:
getString(VARIANT* string_array)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此添加实现代码
VARIANT temp_array;
SAFEARRAY *psa;
string str = "abcdefg";
BSTR bstr = A2BSTR(str.c_str());
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].cElements = 10;
rgsabound[0].lLbound = 0;
psa = SafeArrayCreate(VT_BSTR,1,rgsabound);for(long i = 0; i < 10; i++)
{
if(FAILED(SafeArrayPutElement(psa,&i,bstr)))
::MessageBox(NULL,L"xxx",L"yyy",MB_OK);
}
//temp_array.vt = VT_ARRAY | VT_BSTR; ----------------------(1)
//temp_array.parray = psa;
//string_array = &temp_array;
string_array->parray = psa; ----------------------(2)

return S_OK;
}
请注意(1)和(2)的区别,由于(1)是设立了一个临时变量temp_array,所以当返回的时候临时变量消除,string_array所指向地址也无效,所以要采用(2)的方法,才能正确返回值。
调用:
VARIANT get_array;
pGetString->getString(&get_array);
此时get_array得到所要的值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值