公司提供的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。它是这样规定的:

  1. 字符串开始前的4个字节,表示字符串的长度,它不包括终止符。
  2. 字符串的数据是Unicode。中间可以包含任意多个NULL。
  3. 字符串以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配套使用。

 

引用自COM编程攻略(九 COM设施之BST)

所以正常的写法应该是:

BSTR strM3 = SysAllocString(L"S10 M3");
long ret;
m_pRemoteKernelServer->ExecBlockNoCyStart(1, strM3, &ret);
SysFreeString(strM3);

 

 

posted on 2025-12-31 14:06  lazybee  阅读(5)  评论(0)    收藏  举报