描述:
我建了个COM(用VC),在COM增加了一个方法如下:
STDMETHODIMP CXXX::GetBuf(char *buf)
{
memcpy(buf,"1234",5);
}
我在应用程序调用此方法的时候,buf中的值不对,调用如下:
......
char buf[32];
memset( buf, 0, sizoef(buf) );
pXXX->GetBuf(buf);
......
检查buf的内容,发现只有一个“1”。
请问如果要达到buf中有“1234”,应该如何修改?
万分感谢!!!!
解决方案1:
最好的办法是在COM接口函数声明中不使用char类
型的字符串, COM接口函数声明中对char类型的字
符串不支持, COM中使用的标准字符串是BSTR类型
的, 你可以这样声明:
STDMETHODIMP CXXX::GetBuf(/*[in, out]*/BSTR *bsBuf)
{
*bsBuf = L"1234";
return S_OK;
}
那你用Variant传递参数试试
解决方案3: STDMETHODIMP CXXX::GetBuf(char *buf)
{
char* p = "1234";
memcpy(buf, p, 5);
}
试试
不用memcpy换个函数试试
或者直接用赋值看看会不会出问题
是阿
解决方案6: 没关系,不用这么郑重的道歉
TO wzhing(从不留言) :
很多人存在这样的误区,认为接口声明字符串只能用BSTR,
BSTR是标准自动化类型,如果接口要被VB,脚本调用才必须用BSTR
而且你给的例子…………!!??好像是反面教材!!
to luohualiushui(落花流水)
对不起,看来我学艺不精.回去查了MSDN和几本书后,的确可以对char,byte等施行string属性,都可以表示字符串,抱歉.
to lop5712(LOP):
那行代码我是从msdn拷来的,没有问题
IDL里定义的不对,要像下面这样定义proxy/stub才会知道你的char *pBuf是一个数组,并且你需要传递正确的长度告诉proxy要传递多大的数组,否则proxy只把char *pBuf当作一个cahr的引用类型来传递参数。不过如果你的接口没有通过proxy调用,那么你那样写是可以得到正确结果的,不过这不符合COM规范。
HRESULT GetBuf(
[out, size_is(size), length_is(*pRead)]
char *pBuf,
[in] ULONG size,
[out] ULONG *pRead);
LPTSTR *lpszBuf
请用双指针,
分配空间
CoTaskMemAlloc
楼主的错误是因为使用了代理/占位程序,楼主应该是由MIDL生成的,因此应该修改IDL文件
不过楼上有错误,应该是WCHAR 即
HRESULT Procl([in, string] WCHAR *pszName );
ft
sample:
HRESULT Proc1([in, string] char * pszName);
这样试试
memcpy(buf,"1234",sizeof(char)*5);
GetBuf(char **buf)
{
memcpy(*buf, "1234", 5);
}
在你的idl文件的接口函数声明中,在参数属性中加入string
编译器以为你要传的只是指向一个char的指针,就没有对后面的字符串列散集
所以只有第一个字符被传递
找不出错误