0

HeapAlloc()で使用されるバッファを割り当てるために使用しようとしていますSetupDiGetDeviceRegistryProperty()

内部GetDeviceInformation()には次のものがあります。

HANDLE hHeap = GetProcessHeap();

while (SetupDiEnumDeviceInfo(DeviceInfoSet, MemberIndex++, DeviceInfoData)) 
{
    DWORD DataT;
    LPTSTR buffer = NULL;
    DWORD buffersize = 0;
    // port of device
    DWORD portnum = 0;

    GetRegistryProperty(DeviceInfoSet, DeviceInfoData, SPDRP_FRIENDLYNAME, 
         &DataT, buffer, &buffersize, &buffersize);

    if (!buffer) 
    {
        cerr << "Null Ptr!" << endl;
        exit(1);
    }
    // Do stuff, uninstall device


    if (buffer) HeapFree(hHeap, NULL, buffer); 

    }
}

そして、GetRegistryProperty()私は持っています:

void GetRegistryProperty(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, 
    DWORD Property, PDWORD DataT, LPTSTR buffer, PDWORD buffersize, PDWORD size)
{


    HANDLE hHeap = GetProcessHeap();

    while (!SetupDiGetDeviceRegistryProperty(
        DeviceInfoSet,
        DeviceInfoData,
        Property, //SPDRP_FRIENDLYNAME or SPDRP_CLASS
        DataT, //&DataT
        (PBYTE)buffer,
        *buffersize,
        size)) //&buffersize
    {
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
        {
            // Change the buffer size.
            if (buffer) HeapFree(hHeap, NULL, buffer); 

            // Double the size to avoid problems on 
            // W2k MBCS systems per KB 888609. 
            buffer = (LPTSTR)HeapAlloc(hHeap, HEAP_ZERO_MEMORY |
                HEAP_GENERATE_EXCEPTIONS, *buffersize * 2);
        }
        else
        {
            // error handling
            break;
        }
    }
}

HeapAlloc()GetRegistryProperty()戻るまで期待どおりに動作します (バッファーはプロパティで満たされます) 。この時点で、バッファは常に NULL です。これも想定内?それを作成した関数の寿命を過ぎた配列を指す char * を返すにはどうすればよいですか? HeapAlloc() の仕組みを理解していないと思います。

別の関数でそれを持っている理由は、異なるsGetRegistryProperty()で複数回呼び出したいからです。DWORD Propertyコードを別の関数に移動する前は、完全に機能していました。

4

2 に答える 2

2

参照渡し( LPTSTR&bufferに注意してください) :

void GetRegistryProperty(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, 
    DWORD Property, PDWORD DataT, LPTSTR& buffer, PDWORD buffersize, PDWORD size)
于 2012-11-21T03:06:51.920 に答える
1

値渡しbufferなので、GetRegistryProperty で再割り当てするときは、GetRegistryProperty のポインターのコピーを上書きするだけです。

GetRegistryProperty の署名を次のように変更します。

void GetRegistryProperty(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, PDWORD DataT, LPTSTR& buffer, PDWORD buffersize, PDWORD size)
于 2012-11-21T03:09:07.947 に答える