BSTR,LPCOLESTR和其他人的含义是什么?

时间:2009-10-22 13:37:29

标签: winapi

BSTR,LPCOLESTR,LPCWSTR,LPTSTR,LPCWCHAR以及许多其他的含义是什么,如果它们只是一堆解析为wchar_t的定义?

3 个答案:

答案 0 :(得分:10)

LPTSTR和LPWSTR以及类似的定义实际上只是定义。 BSTR和LPOLESTR具有特殊含义 - 它们表示指向的字符串是以特殊方式分配的。

BSTR指向的字符串必须与SysAllocString()系列函数一起分配。 LPOLESTR指向的字符串通常用CoTaskMemAlloc()分配(这应该在文档中查找接受/返回它的COM调用)。

如果违反了BSTR和LPOLESTR指向的字符串的分配/解除分配要求,程序可能会遇到未定义的行为。

答案 1 :(得分:10)

  • LPTSTR表示字符串缓冲区可以是ANSI或UNICODE,具体取决于宏的定义:UNICODE
  • LPCOLESTR是由OLE团队发明的,因为它根据wchar_t
  • 的定义在char和OLE2ANSI之间切换行为
  • LPCWSTRwchar_t字符串
  • BSTR是已使用SysAllocString分配的LPOLESTR。
  • LPCWCHAR是指向单个常量宽字符的指针。

他们实际上完全不同。或者至少,在某些时候是不同的。 Ole开发 - 并且需要 - 宽字符串,而Windows API仍然是Win16并且根本不支持宽字符串。

此外,早期版本的Windows SDK并没有将wchar_t用于WCHAR,而是使用unsigned short。 GCC上的Windows SDK变得有趣,因为 - 我认为GCC 32位有一个32位wchar_t - 在32位wchar_t的编译器上,WCHAR将被定义为无符号短路或其他类型的16位编译器。

答案 2 :(得分:2)

MSDN在Windows Data Types上的页面可能会澄清其中某些数据类型之间的差异。

  

LPCWSTR - 指向16位常量以空字符结尾的字符串的指针   Unicode字符。

     

LPTSTR - 如果定义了UNICODE,则为 LPWSTR ,否则为 LPSTR