vckbase网站上面的<<COM组建设计与应用>>系列教程里面说道:由于BSTR的指针就是指向 UNICODE 串,因此 BSTR 和 LPOLESTR 可以在一定程度上混用,但一定要注意:
有函数 fun(LPCOLESTR lp),则你调用 BSTR p=...; fun(p); 正确
有函数 fun(const BSTR bstr),则你调用 LPCOLESTR p=...; fun(p); 错误!!!为什么第二种类型转换就是错误的呢? 我百思不得其解啊

解决方案 »

  1.   

    1、BSTR是指针,指向一个带长度前缀的OLECHAR字符数组。
    2、LPCOLESTR是指针常量,指向的OLECHAR字符数组。简单的说差别是 BSTR比LPCOLESTR多了长度前缀。
    fun(const BSTR bstr),则你调用 LPCOLESTR p=...; fun(p); 这里的fun希冀的是得到一个BSTR,函数内部可能要用到BSTR的长度前缀这个字段属性,此时如果你传的是一个无长度前缀的LPCOLESTR,函数内就可能会发生不可估计的逻辑错误。反过来却不会发生错误(多出来属性我可以不用)。所以语法上做了这个限制。关于各平台上的字符串的转换都会用到特定的宏,LPCOLESTR与BSTR肯定是有ATL字符串转换宏的吧。为了操作的安全,建议不直接混用。当然这都是我的猜测,我没用过COM,我刚才研究了一下。
      

  2.   

    BSTR带长度,字符串中间可以有'\0'