Преобразование HLOCAL в LPTSTR - PullRequest
2 голосов
/ 27 октября 2010

Как преобразовать тип данных 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 ]

5 голосов
/ 27 октября 2010

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];

Не обращая внимания на ~ 7-летнюю глупость все еще использования TCHAR на мгновение.Ваш оператор printf () нуждается в работе, в зависимости от того, используете ли вы Unicode или нет.% ls, если вы делаете.Я предполагаю, что это ваша настоящая проблема, используйте wprintf ().

1 голос
/ 27 октября 2010
  buffer = (LPTSTR)LocalAlloc(LPTR, buffersize * 2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...