【问题标题】:VC++ HeapAlloc inside function gives null pointerVC++ HeapAlloc内部函数给出空指针
【发布时间】:2012-11-21 02:58:52
【问题描述】:

我正在尝试使用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() 是如何工作的。

我把它放在一个单独的函数中的原因是我想用不同的DWORD Propertys 多次调用GetRegistryProperty()。在我将代码移动到单独的函数之前,它运行良好。

【问题讨论】:

    标签: c++ c visual-c++ malloc heapalloc


    【解决方案1】:

    通过引用传递buffer(注意LPTSTR&):

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

    【讨论】:

      【解决方案2】:

      您正在通过值传递buffer,因此在 GetRegistryProperty 中,当您重新分配它时,您只需覆盖 GetRegistryProperty 中的指针副本。

      将GetRegistryProperty的签名改为:

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

      【讨论】:

        猜你喜欢
        • 2012-01-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2012-11-05
        • 2018-04-17
        • 1970-01-01
        • 1970-01-01
        • 2017-09-29
        相关资源
        最近更新 更多