C++ 将HLOCAL转换为LPTSTR

C++ 将HLOCAL转换为LPTSTR,c++,winapi,C++,Winapi,如何将HLOCAL数据类型转换为LPTSTR数据类型?我正在尝试从Microsoft working获取代码片段,这是唯一的错误,我不确定如何解决: // Create a HDEVINFO with all present devices. hDevInfo = SetupDiGetClassDevs(NULL, 0, // Enumerator 0, DIGCF_PRESENT | DIGCF_ALLCLASSES ); if (hDevInfo == INVALI

如何将
HLOCAL
数据类型转换为
LPTSTR
数据类型?我正在尝试从Microsoft working获取代码片段,这是唯一的错误,我不确定如何解决:

// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(NULL,
    0, // Enumerator
    0,
    DIGCF_PRESENT | DIGCF_ALLCLASSES );

if (hDevInfo == INVALID_HANDLE_VALUE)
{
    // Insert error handling here.
    return NULL;
}

// Enumerate through all devices in Set.

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i=0;SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);i++)
{
    DWORD DataT;
    LPTSTR buffer = NULL;
    DWORD buffersize = 0;

    //
    // Call function with null to begin with, 
    // then use the returned buffer size (doubled)
    // to Alloc the buffer. Keep calling until
    // success or an unknown failure.
    //
    //  Double the returned buffersize to correct
    //  for underlying legacy CM functions that 
    //  return an incorrect buffersize value on 
    //  DBCS/MBCS systems.
    // 
    while (!SetupDiGetDeviceRegistryProperty(
        hDevInfo,
        &DeviceInfoData,
        SPDRP_DEVICEDESC,
        &DataT,
        (PBYTE)buffer,
        buffersize,
        &buffersize))
    {
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
        {
            // Change the buffer size.
            if (buffer) LocalFree(buffer);
            // Double the size to avoid problems on 
            // W2k MBCS systems per KB 888609. 
            buffer = LocalAlloc(LPTR,buffersize * 2); // <- Error Occurs Here
        }
        else
        {
            // Insert error handling here.
            break;
        }
    }

    printf("Result:[%s]\n",buffer);

    if (buffer) LocalFree(buffer);
}


if ( GetLastError()!=NO_ERROR && GetLastError()!=ERROR_NO_MORE_ITEMS )
{
    // Insert error handling here.
    return NULL;
}

//  Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
//使用所有现有设备创建HDEVINFO。
hDevInfo=SetupDiGetClassDevs(空,
0,//枚举数
0,
DIGCF_当前| DIGCF_所有类别);
if(hDevInfo==无效的句柄值)
{
//在此处插入错误处理。
返回NULL;
}
//枚举集合中的所有设备。
DeviceInfo DATA.cbSize=sizeof(SP_DEVINFO_数据);
对于(i=0;SetupDiEnumDeviceInfo(hdeInfo、i和DeviceInfo数据);i++)
{
德沃德·达特;
LPTSTR缓冲区=NULL;
DWORD缓冲区大小=0;
//
//以null开头调用函数,
//然后使用返回的缓冲区大小(加倍)
//要分配缓冲区,请继续调用,直到
//成功或未知的失败。
//
//将返回的缓冲区大小加倍以进行更正
//对于基本的遗留CM函数
//在上返回不正确的buffersize值
//DBCS/MBCS系统。
// 
而(!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfo数据,
SPDRP_设备ESC,
&DataT,
(PBYTE)缓冲器,
缓冲区大小,
&缓冲区大小)
{
如果(GetLastError()==错误\u缓冲区不足)
{
//更改缓冲区大小。
if(缓冲区)LocalFree(缓冲区);
//将大小增加一倍以避免出现问题
//每KB 888609配备W2k MBCS系统。
buffer=LocalAlloc(LPTR,buffersize*2);//LocalLock()返回指针。但这是18年前的愚蠢行为,只需使用

        // Change the buffer size.
        delete buffer;
        // Double the size to avoid problems on 
        // W2k MBCS systems per KB 888609. 
        buffer = new TCHAR[buffersize * 2];
暂时忽略仍然使用TCHAR的~7年来的愚蠢。printf()语句需要处理,这取决于您是否使用Unicode进行编译。%ls如果使用Unicode进行编译。我猜这是您真正的问题,请使用wprintf()。

LocalAlloc()返回指向缓冲区ala malloc()的指针;只需将其转换为LPTSTR即可。
  buffer = (LPTSTR)LocalAlloc(LPTR, buffersize * 2);