公司提供的COM接口函数:
ExecBlockNoCyStart( long numcanal,BSTR str_block, long *retval) ;
第二个参数是BSTR类型, 我就想当然的进行了下面的操作:
BSTR strM3 = L"S10 M3";
long ret;
ExecBlockNoCyStart(1, strM3, &ret);
奇怪的是这个函数总是调用失败;最后才发现是BSTR类型不能这么使用;原因如下:
COM中的字符串叫做BSTR。它可以被称作Basic String或者Binary String。它是这样规定的:
- 字符串开始前的4个字节,表示字符串的长度,它不包括终止符。
- 字符串的数据是Unicode。中间可以包含任意多个NULL。
- 字符串以NULL为终止符结束。
无论是VB,还是Java,或者是C++编写出来的程序,所有的字符串都使用BSTR,所以严格遵守着上面的规定。这意味着下面的代码:
BSTR myString = L"Hello!";
是错误的。原因是它不符合第一条原则,在字符H之前并不存在4个字节来表示字符串的大小。
COM提供了一套API,来创建、修改、释放字符串。它们分别是:
BSTR SysAllocString(const OLECHAR *psz) : 分配一个BSTR,其内容为psz。我们可以直接传NULL表示一个空字符串。
void SysFreeString(BSTR bstrString):释放一个BSTR,需要和SysAllocString配套使用。
所以正常的写法应该是:
BSTR strM3 = SysAllocString(L"S10 M3");
long ret;
m_pRemoteKernelServer->ExecBlockNoCyStart(1, strM3, &ret);
SysFreeString(strM3);
浙公网安备 33010602011771号