首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VC++ HeapAlloc内部函数提供空指针

VC++ HeapAlloc内部函数提供空指针
EN

Stack Overflow用户
提问于 2012-11-21 10:58:52
回答 2查看 382关注 0票数 0

我正在尝试使用HeapAlloc()来分配SetupDiGetDeviceRegistryProperty()使用的缓冲区。

GetDeviceInformation()中,我有:

代码语言:javascript
复制
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()内部,我有:

代码语言:javascript
复制
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;
        }
    }
}

GetRegistryProperty()返回之前,HeapAlloc()会按预期工作(缓冲区中填充了该属性)。此时,缓冲区始终为空。这也是意料之中的吗?如何返回指向一个数组的char *,该数组存在于创建它的函数的生命周期之后?我假设我不理解HeapAlloc()是如何工作的。

我把它放在一个单独的函数中的原因是,我想用不同的DWORD Property多次调用GetRegistryProperty(),在我将代码移到一个单独的函数之前,它工作得很好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-21 11:06:52

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

代码语言:javascript
复制
void GetRegistryProperty(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, 
    DWORD Property, PDWORD DataT, LPTSTR& buffer, PDWORD buffersize, PDWORD size)
票数 2
EN

Stack Overflow用户

发布于 2012-11-21 11:09:08

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

将GetRegistryProperty的签名更改为:

代码语言:javascript
复制
void GetRegistryProperty(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, PDWORD DataT, LPTSTR& buffer, PDWORD buffersize, PDWORD size)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13485672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档