2

我正在尝试列出连接到我的系统的所有设备,并在搜索后发现此代码引发错误本地函数定义是非法的,有人可以解释一下它的含义。

或者是我的问题,因为我正在尝试使用来自 C++ 的代码。谢谢

工作代码

#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
#pragma comment(lib,"SetupAPI") 


void print_property
(
    __in HDEVINFO hDevInfo,
    __in SP_DEVINFO_DATA DeviceInfoData,
    __in PCWSTR Label,
    __in DWORD Property
)
{
    DWORD DataT;
    LPTSTR buffer = NULL;
    DWORD buffersize = 0;

    // 
    while (!SetupDiGetDeviceRegistryProperty(
                hDevInfo,
                &DeviceInfoData,
                Property,
                &DataT,
                (PBYTE)buffer,
                buffersize,
                &buffersize))
    {
        if (ERROR_INSUFFICIENT_BUFFER == GetLastError())
        {
            // Change the buffer size.
            if (buffer)
            {
                LocalFree(buffer);
            }
            // Double the size to avoid problems on 
            // W2k MBCS systems per KB 888609. 
            buffer = (LPTSTR)LocalAlloc(LPTR, buffersize * 2);
        }
        else
        {
            break;
        }
    }

    wprintf(L"%s %s\n",Label, buffer);

    if (buffer)
    {
        LocalFree(buffer);
    }
}



int main() 
{


    //int setupdi_version()
    //{
    HDEVINFO hDevInfo;
    SP_DEVINFO_DATA DeviceInfoData;
    DWORD i;

    // Create a HDEVINFO with all present devices.
    hDevInfo = SetupDiGetClassDevs(
        NULL,
        0, // Enumerator
        0,
        DIGCF_PRESENT | DIGCF_ALLCLASSES);

    if (INVALID_HANDLE_VALUE == hDevInfo)
    {
        // Insert error handling here.
        return 1;
    }

    // Enumerate through all devices in Set.

    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

    for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++)
    {
        LPTSTR buffer = NULL;
        DWORD buffersize = 0;

        print_property(hDevInfo, DeviceInfoData, L"Friendly name :", SPDRP_FRIENDLYNAME);

        while (!SetupDiGetDeviceInstanceId(
            hDevInfo, 
            &DeviceInfoData, 
            buffer, 
            buffersize, 
            &buffersize))
        {
            if (buffer)
            {
                LocalFree(buffer);
            }

            if (ERROR_INSUFFICIENT_BUFFER == GetLastError())
            {
                // Change the buffer size.
                // Double the size to avoid problems on
                // W2k MBCS systems per KB 888609.
                buffer = (LPTSTR)LocalAlloc(LPTR, buffersize * 2);
            }
            else
            {
                wprintf(L"error: could not get device instance id (0x%x)\n", GetLastError());
                break;
            }
        }

        if (buffer)
        {
            wprintf(L"\tDeviceInstanceId : %s\n", buffer);
        }

        print_property(hDevInfo, DeviceInfoData, L"\tClass :", SPDRP_CLASS);
        print_property(hDevInfo, DeviceInfoData, L"\tClass GUID :", SPDRP_CLASSGUID);
    }


    if (NO_ERROR != GetLastError() && ERROR_NO_MORE_ITEMS != GetLastError())
    {
        // Insert error handling here.
        return 1;
    }

    // Cleanup
    SetupDiDestroyDeviceInfoList(hDevInfo);

    system ("pause");

    return 0;

}
4

2 回答 2

1

main您在;的主体内定义了另一个函数 这是无效的 C. 将其移出main.

于 2012-07-22T19:38:37.793 回答
0

如果您注释掉以下两行,代码将编译并运行,如下所示:

// int setupdi_version()
// {

我认为原始代码来自一个名为的函数setupdi_version(),当您尝试将其更改为main(). 注意:看起来原始源代码来自这里

回答您的后续问题。这些是链接器错误。您需要告诉 Visual Studio.lib要链接的文件。您可以在 Visual Studio 项目依赖项中执行此操作,或者只需将以下内容添加到源代码的顶部。

#pragma comment(lib,"SetupAPI")
于 2012-07-22T20:00:43.330 回答