BSTR,LPCOLESTR,LPCWSTR,LPTSTR,LPCWCHAR以及许多其他的含义是什么,如果它们只是一堆解析为wchar_t的定义?
答案 0 :(得分:10)
LPTSTR和LPWSTR以及类似的定义实际上只是定义。 BSTR和LPOLESTR具有特殊含义 - 它们表示指向的字符串是以特殊方式分配的。
BSTR指向的字符串必须与SysAllocString()系列函数一起分配。 LPOLESTR指向的字符串通常用CoTaskMemAlloc()分配(这应该在文档中查找接受/返回它的COM调用)。
如果违反了BSTR和LPOLESTR指向的字符串的分配/解除分配要求,程序可能会遇到未定义的行为。
答案 1 :(得分:10)
LPTSTR
表示字符串缓冲区可以是ANSI或UNICODE,具体取决于宏的定义:UNICODE
。LPCOLESTR
是由OLE团队发明的,因为它根据wchar_t
OLE2ANSI
之间切换行为
LPCWSTR
是wchar_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 。