首页 > 解决方案 > 使用 SetupDiGetDeviceRegistryPropertyW 获取所需大小的错误代码 122

问题描述

我想通过使用 Setup API 来获取 USB 记忆棒的设备 ID,但首先我想了解一些我必须使用的功能。文档说我可以将SetupDiGetDeviceRegistryPropertyNULL 发送到缓冲区和缓冲区大小以获得所需的大小,但我收到122错误代码,这意味着:

传递给系统调用的数据区域太小

谁能告诉我我做错了什么?

到目前为止,这是我的代码:

#include <Windows.h>
#include <wchar.h>
#include <SetupAPI.h>

#pragma comment(lib, "Setupapi.lib")

int wmain(int argc, wchar_t *arv[])
{
    // SetupDiGetClassDevs
    HDEVINFO hDeviceInfo;
    DWORD filterDevInfo = DIGCF_ALLCLASSES;

    hDeviceInfo = SetupDiGetClassDevsW(NULL, NULL, NULL, filterDevInfo);

    if (hDeviceInfo != INVALID_HANDLE_VALUE)
    {
        // SetupDiEnumDeviceInfo
        DWORD memberIndex = 0;
        SP_DEVINFO_DATA devInfoData;

        devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

        if (!SetupDiEnumDeviceInfo(
            hDeviceInfo,
            memberIndex,
            &devInfoData))
        {
            fwprintf(stderr, L"Error on enum: %u\n", GetLastError());
            return 1;

        }

        // SetupDiGetDeviceRegistryProperty
        DWORD propertyRetrieved = SPDRP_DEVICEDESC;
        DWORD requiredSize;

        // First call to get the required size for the buffer

        if (!SetupDiGetDeviceRegistryPropertyW(
            hDeviceInfo,
            &devInfoData,
            propertyRetrieved,
            NULL,
            NULL,
            0,
            &requiredSize))
        {
            fwprintf(stderr, L"Error on registry property: %u\n", GetLastError());
            return 1;

        }

    }
    else
    {
        wprintf(L"Error code: %u\n", GetLastError());
        return 1;
    }

    return 0;
}

标签: c++cwinapisetupapi

解决方案


推荐阅读