您的位置:首页 > 编程语言

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

2014-06-03 15:26 183 查看
由于项目中要用到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得到所要的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  COM VARIANT 数组 字符串