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。"这是一个很好的开始。我在我的时间里看到了很多古怪的缩进,但是只在外部代码>下缩进了争论,而或
int setupdi_version()
行似乎开始出错。int setupdi_version()的定义
似乎在main()
的定义中开始,但没有对setupdi\u version()的调用,还有一个丢失的括号。你能告诉我们你在哪里找到的这个代码吗?< <代码> >包含< /C> >暗示这是C++代码。缩进是非常重要的。我编辑了你的文章来纠正缩进,然后你的编辑左对齐了所有的东西……我刚重新确定了缩进。