从 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 层)。另外,不用LocalAllocLocalFree,直接使用std::basic_string 作为缓冲区。一般来说,在现代 C++ 中进行“手动”动态分配是非常愚蠢的,尤其是当您所做的只是将数据复制到标准库容器时:首先使用该容器。 另外,使用typedef 而不是#define:避免那些讨厌的无意文本替换。 @Cheersandhth.-Alf 感谢您的洞察力。是否可以提供一个如何在我的函数中使用 basic_string 的示例? stringbasic_string<char> 的 typedef,wstringbasic_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

从 x 到 y 的协变数组转换可能会导致运行时异常

不能从const char *转换为LPCWSTR

如何检查 LPTSTR 字符串的内容?

怎么把char型数组转换为lpwstr

LPSTR LPTSTR