将HLOCAL转换为LPTSTR

时间:2010-10-26 20:52:25

标签: 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);

欢迎提出意见。感谢。

2 个答案:

答案 0 :(得分: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];

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

答案 1 :(得分:1)

  buffer = (LPTSTR)LocalAlloc(LPTR, buffersize * 2);