C Visual Studio拒绝本地函数定义

C Visual Studio拒绝本地函数定义,c,tags,device,C,Tags,Device,我正在尝试列出所有连接到我的系统的设备,搜索后发现此代码抛出错误,本地函数定义是非法的,有人能解释一下它的意思吗 或者是我的问题,因为我试图使用C++中的代码。谢谢 工作代码 #include <windows.h> #include <setupapi.h> #include <stdio.h> #pragma comment(lib,"SetupAPI") void print_property ( __in HDEVINFO hDevInf

我正在尝试列出所有连接到我的系统的设备,搜索后发现此代码抛出错误,本地函数定义是非法的,有人能解释一下它的意思吗

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

}
#包括
#包括
#包括
#pragma注释(lib,“SetupAPI”)
无效打印属性
(
__在HDEVINFO HDEVINFO中,
__在SP_设备信息数据设备信息数据中,
__在PCWSTR标签中,
__在德沃德属性中
)
{
德沃德·达特;
LPTSTR缓冲区=NULL;
DWORD缓冲区大小=0;
// 
而(!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfo数据,
财产,,
&DataT,
(PBYTE)缓冲器,
缓冲区大小,
&缓冲区大小)
{
如果(错误\缓冲区不足==GetLastError())
{
//更改缓冲区大小。
if(缓冲区)
{
本地自由(缓冲区);
}
//将大小增加一倍以避免出现问题
//每KB 888609配备W2k MBCS系统。
buffer=(LPTSTR)LocalAlloc(LPTR,buffersize*2);
}
其他的
{
打破
}
}
wprintf(L“%s%s\n”,标签,缓冲区);
if(缓冲区)
{
本地自由(缓冲区);
}
}
int main()
{
//int setupdi_版本()
//{
HDEVINFO HDEVINFO;
SP_设备信息_数据设备信息数据;
德沃德一世;
//使用所有现有设备创建HDEVINFO。
hDevInfo=SetupDiGetClassDevs(
无效的
0,//枚举数
0,
DIGCF_当前| DIGCF_所有类别);
if(无效的句柄值==hDevInfo)
{
//在此处插入错误处理。
返回1;
}
//枚举集合中的所有设备。
DeviceInfo DATA.cbSize=sizeof(SP_DEVINFO_数据);
对于(i=0;SetupDiEnumDeviceInfo(hdeInfo、i和DeviceInfo数据);i++)
{
LPTSTR缓冲区=NULL;
DWORD缓冲区大小=0;
打印属性(hDevInfo,deviceinfo,L“友好名称:”,SPDRP\u FRIENDLYNAME);
而(!SetupDiGetDeviceInstanceId(
hDevInfo,
&DeviceInfo数据,
缓冲器
缓冲区大小,
&缓冲区大小)
{
if(缓冲区)
{
本地自由(缓冲区);
}
如果(错误\缓冲区不足==GetLastError())
{
//更改缓冲区大小。
//将大小增加一倍以避免出现问题
//每KB 888609配备W2k MBCS系统。
buffer=(LPTSTR)LocalAlloc(LPTR,buffersize*2);
}
其他的
{
wprintf(L“错误:无法获取设备实例id(0x%x)\n”,GetLastError());
打破
}
}
if(缓冲区)
{
wprintf(L“\t设备安装ID:%s\n”,缓冲区);
}
打印属性(hDevInfo,deviceinfo,L“\tClass:”,SPDRP_类);
打印属性(hDevInfo,DeviceInfo数据,L“\tClass GUID:”,SPDRP\U类GUID);
}
如果(无错误!=GetLastError()&&ERROR\u无更多项目!=GetLastError())
{
//在此处插入错误处理。
返回1;
}
//清理
SetupDiDestroyDeviceInfo列表(hDevInfo);
系统(“暂停”);
返回0;
}

您在
main
的主体中定义了另一个函数;这是无效的C。请将其移到
main
之外,如果您注释掉以下两行,代码将编译并运行,如图所示:

// int setupdi_version()
// {
我认为原始代码来自一个名为
setupdi\u version()
的函数,当您试图将其更改为
main()
时,它有点被破坏。注意:原始源代码似乎来自

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

#pragma comment(lib,"SetupAPI")

有些编译器可能允许这个扩展(例如,我相信GCC确实如此),但它在C和C++中都是非标准的。谢谢我的回复,我尝试移动int StudidiuValuy()部分,在主外抛出大约29个错误。有没有一种好的格式化方法呢?或者我应该把它放在别处看看吗?“如果您要在函数调用中间断开该行,则将第二行缩进一个函数调用的打开PARN。"这是一个很好的开始。我在我的时间里看到了很多古怪的缩进,但是只在外部代码>下缩进了争论,而或 > 语句…!谢谢,我在一个博客上找到的,是C++的,但是我尝试把它转换成C。尝试获取Val+PID +GuID的拉路径。我在C中寻找StudiDigeDeVestIsNeSnID和StudiDigeCeCudiDeS的工作示例。我在MSDN上读取了,但是有点混乱,只有C++例子。@ CaliRekk:编译器不关心代码是如何格式化的(尽管任何人都读过代码)。。如果你修改了代码格式,很容易发现你的大括号不平衡,而且某个地方有打字错误。
int setupdi_version()
行似乎开始出错。
int setupdi_version()的定义
似乎在
main()
的定义中开始,但没有对
setupdi\u version()的调用,还有一个丢失的括号。你能告诉我们你在哪里找到的这个代码吗?< <代码> >包含< /C> >暗示这是C++代码。缩进是非常重要的。我编辑了你的文章来纠正缩进,然后你的编辑左对齐了所有的东西……我刚重新确定了缩进。