将HLOCAL转换为LPTSTR

Jim*_*ell 2 c++ winapi

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

// 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);
Run Code Online (Sandbox Code Playgroud)

欢迎思考.谢谢.

Han*_*ant 5

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];
Run Code Online (Sandbox Code Playgroud)

忽略了仍然使用TCHAR片刻的〜7岁的愚蠢.您的printf()语句需要工作,具体取决于您是否使用Unicode进行编译.%ls如果你这样做.我猜这是你真正的问题,请使用wprintf().