关于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得到所要的值。
相关文章推荐
- 关于USB-AUDIO使用ALSA编程的一点问题
- 关于USB-AUDIO使用ALSA编程的一点问题
- 关于USB-AUDIO使用ALSA编程的一点问题
- 关于USB-AUDIO使用ALSA编程的一点问题
- 安卓编程中关于hashmap及其他的一点问题
- 关于USB-AUDIO使用ALSA编程的一点问题
- 关于图像处理的一点问题
- [技术讨论]关于交换编程实践的交换周期问题
- 关于exe形式编程的一点心得,希望对大家有所帮助
- 关于安全的ActiveX控件的编写,纠正大家一点错误,包括MSDN上也有问题
- 关于安全的ActiveX控件的编写,纠正大家一点错误,包括MSDN上也有问题
- 关于表分区的一点问题
- 好长时间上不了博客,我还以为因为我发表抗日言论账户被删了,编程中好多新经验新发现不能拿出来和朋友们分享,那个急呀。以下是我在工作中积累的一些经验和解决的一些问题,希望能对大家有一点帮助。
- 关于安全的ActiveX控件的编写,纠正大家一点错误,包括MSDN上也有问题
- 现在想起来,一个最早学习编程的时候的问题, 关于文本文件的读写
- 关于matlab与c#混合编程产生的移植问题
- 关于复杂问题向01两种状态转化的一点看法
- 关于读取数据库时中文编程乱码的问题
- 一则关于对象的使用原则,也许编程十年了,也没注意到的问题
- 最近碰到个问题,关于php扩展编程如何返回数组的问题