关于COM类型转换问题

VincentChin 2001-11-19 03:06:37
我定义了两个变量,一个是void *piaRef=new unsigned char[1000];另一个是m_Temp=new CComVariant();我的问题是如何将piaRef中的值COPY到m_Temp中。
...全文
198 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
VincentChin 2001-11-23
  • 打赏
  • 举报
回复
谢谢各位的回复!我的问题解决了!如下:
SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, 1000);
if (!psa)
return S_FALSE;
HRESULT hr;
for (long i = 0; i < 1000; i ++)
if (FAILED (hr = SafeArrayPutElement(psa, &i, ((unsigned char*)piaRefTemplate) + i)))
return S_FALSE;
VARIANT va;
va.vt = VT_ARRAY | VT_UI1;
va.parray = psa;
CComVariant *m_Temp = new CComVariant();
m_Temp->Copy(&va);
GrayWhite 2001-11-22
  • 打赏
  • 举报
回复
哦,我明白了,你要各字节数组:
SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, 1000);
if (!psa)
_com_issue_error(ERROR_NOT_ENOUGH_MEMORY);

HRESULT hr
for (long i = 0; i < 2; i ++)
{
if (FAILED (hr = SafeArrayPutElement(psa, &i, piaRef + i)))
_com_issue_error(hr);
}

_variant_t va; // include <comdef.h>
va.vt = VT_ARRAY | VT_UI1;
va.parray = psa;

m_Temp = new CComVariant(va);
xtky_limi 2001-11-22
  • 打赏
  • 举报
回复
旁听
GrayWhite 2001-11-22
  • 打赏
  • 举报
回复
m_Temp = new CComVariant((char*) piaRef);就可以了。VB就是用的BSTR,你要给谁用阿?VC不用VARIANT的。
蒋晟 2001-11-22
  • 打赏
  • 举报
回复
把这个属性的类型改成BSTR
VincentChin 2001-11-22
  • 打赏
  • 举报
回复
m_Temp=new CComVariant(::SysAllocString(OLECHAR *)piaRef));没有出错,但是我的m_Temp是COM组件中的一个PROPERTY,我想返回的是unsigned char类型(单字节),但经过上述转换后,就不再是单字节了呀!怎么办?
VincentChin 2001-11-22
  • 打赏
  • 举报
回复
//error C2440: '=' : cannot convert from 'unsigned short *' to 'class ATL::CComVariant *'
nichang 2001-11-22
  • 打赏
  • 举报
回复
m_Temp=::SysAllocString((OLECHAR *)piaRef)
蒋晟 2001-11-22
  • 打赏
  • 举报
回复
用字符串数组
nichang 2001-11-22
  • 打赏
  • 举报
回复
将'\0'转换成其它如'\1'就OK了,
VincentChin 2001-11-22
  • 打赏
  • 举报
回复
谢谢你!
但我还有一个问题,就是如果在s中有'\0'之类的东西我该怎么返回呢?char *遇到'\0'会认为到头了。
完整的设计是这样的,我定义一个void * 用来从一个外部设备获取数据,该数据应该是unsigned char,我想把这个返回的数据作为属性传出,让其它应用使用(如VB)。
nichang 2001-11-22
  • 打赏
  • 举报
回复
unsigned char *s=new unsigned char[1000];
strcpy((char*)s,"1234");//可以用你自己方法设置s中的值。
BSTR bstrS;
oleS=A2WBSTR((char*)s);//将char*转换成BSTR类型

CComVariant comVT;
comVT=oleS;//将BSTR转成CComVariant,这里一步也可,comVT=A2WBSTR((char*)s);
VincentChin 2001-11-22
  • 打赏
  • 举报
回复
我是想把piaRef中的值照原样返回给其它程序使用。我正在做的是一个COM组件。谢谢各位!
nichang 2001-11-22
  • 打赏
  • 举报
回复
到底你想怎样转换嘛,是将数组内的值拷贝到CComVariant中存为字符串吗?
VincentChin 2001-11-22
  • 打赏
  • 举报
回复
To GrayWhite:
为什么要for(long i=0;i<2;i++)?
VincentChin 2001-11-22
  • 打赏
  • 举报
回复
SafeArrayPutElement(psa, &i, piaRef + i)
//error C2036: 'void *' : unknown size
VincentChin 2001-11-21
  • 打赏
  • 举报
回复
会报错:
error C2440: 'type cast' : cannot convert from 'unsigned char *' to 'class ATL::CComBSTR'
VincentChin 2001-11-21
  • 打赏
  • 举报
回复
我用CComBSTR bsRef=(unsigned char*)piaRef,也不行吗?
nichang 2001-11-21
  • 打赏
  • 举报
回复
将void*改为unsigned char *
VincentChin 2001-11-21
  • 打赏
  • 举报
回复
CComBSTR bsRef=piaRef;
//error C2440: 'initializing' : cannot convert from 'void *' to 'class ATL::CComBSTR'
m_Temp=bsRef.copy();
//error C2440: '=' : cannot convert from 'unsigned short *' to 'class ATL::CComVariant *'
加载更多回复(1)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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