Visual Studio拒绝本地函数定义

时间:2012-07-22 19:36:38

标签: c tags device

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

或者是我的问题,因为我正在尝试使用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;

}

2 个答案:

答案 0 :(得分:1)

您在main的正文中定义了另一个函数;这是无效的C.将其移到main之外。

答案 1 :(得分:0)

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

// int setupdi_version()
// {

我认为原始代码来自名为setupdi_version()的函数,当您尝试将其更改为main()时,它会受到严重破坏。注意:原始源代码看起来来自here

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

#pragma comment(lib,"SetupAPI")