从 LPTSTR 到 tstring 的转换会导致运行时错误
Posted
技术标签:
【中文标题】从 LPTSTR 到 tstring 的转换会导致运行时错误【英文标题】:Conversion from LPTSTR to tstring causes runtime error 【发布时间】:2013-01-26 23:47:27 【问题描述】:我正在尝试将 LPTSTR 变量转换为 tstring(即,unicode 应用程序中的 wstring 和 ANSI 中的字符串)。
如何执行此转换?
我的代码尝试执行转换,但它导致错误:“调试断言失败!表达式:无效的空指针”:
#ifdef UNICODE
#define tstring std::wstring
#else
#define tstring std::string
#endif
tstring TVManager::getDevicePropertyTEST(HDEVINFO hDevInfo, SP_DEVINFO_DATA deviceInfoData, DWORD flag)
DWORD dataT = 0;
DWORD buffersize = 0;
LPTSTR buffer = NULL;
while (!SetupDiGetDeviceRegistryProperty(hDevInfo, &deviceInfoData, flag, &dataT,
(PBYTE)buffer, buffersize, &buffersize))
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
// Change the buffer size.
if (buffer)
LocalFree(buffer);
buffer = (LPTSTR)LocalAlloc(LPTR, buffersize);
else
// Insert error handling here.
debug_print_ex("Else happened:", buffer);
break;
tstring propertyValue = tstring(buffer); // ERROR OCCURS HERE
if (buffer)
LocalFree(buffer);
return propertyValue;
【问题讨论】:
不使用T
的东西来简化事情。 T
是关于支持 Windows 9x 的。从 2013 年起,没有充分的理由支持 Windows 9x(此外,如果您想支持它,那么合理的方式是使用 Unicode 层)。另外,不用LocalAlloc
和LocalFree
,直接使用std::basic_string
作为缓冲区。一般来说,在现代 C++ 中进行“手动”动态分配是非常愚蠢的,尤其是当您所做的只是将数据复制到标准库容器时:首先使用该容器。
另外,使用typedef
而不是#define
:避免那些讨厌的无意文本替换。
@Cheersandhth.-Alf 感谢您的洞察力。是否可以提供一个如何在我的函数中使用 basic_string 的示例?
string
是 basic_string<char>
的 typedef,wstring
是 basic_string<wchar_t>
。在摆脱了T
的东西之后,你大概会使用wstring
。用大小 1 声明它,以便在开始时拥有一个缓冲区。通过&s[0]
获得指向缓冲区的指针(不依赖于C++11 data
方法,此外这是一个成语)。使用resize
调整大小。
顺便说一句,正如其他人提到的那样,肯定有更好的方法来解决这个问题,但就您的 tstring
定义而言,只做 typedef std::basic_string<TCHAR> tstring;
(或 @ 987654340@ 在 C++11 中)。
【参考方案1】:
您将一个空指针传递给std::basic_string<>
的构造函数——不好。如果buffer
为空,假设您只想要一个空字符串,则执行以下操作:
tstring propertyValue;
if (buffer)
propertyValue = buffer;
【讨论】:
最好向 OP 解释整个方法是如何被误导的,而不是(仅)回答有关如何通过粘贴一些 Rube Goldberg 的东西和手摇来启动汽车发动机的技术以上是关于从 LPTSTR 到 tstring 的转换会导致运行时错误的主要内容,如果未能解决你的问题,请参考以下文章
error C2664: “int CWnd::GetWindowTextW(LPTSTR,int) const”: 不能将参数 1 从“char [10]”转换为“LP