MinGW编译器的GUID使用时,出现类似undefined reference to `GUID_DEVCLASS_PORTS'错误。
最近在写一个串口程序,在编写获取所有串口的程序时,参考网上的资料,用了SetupDiGetClassDevs函数,但是在调用GUID时,总是出现错误:undefinedr...
最近在写一个串口程序,在编写获取所有串口的程序时,参考网上的资料,用了SetupDiGetClassDevs函数,但是在调用GUID时,总是出现错误:undefined reference to `GUID_DEVCLASS_PORTS'。看现象是这个没有定义。
这个程序在Visual 2015上是可以编译通过正常运行的,而且Visual Studio的devguid.h和Mingw的不太一样,Visual Studio的devguid.h文件中直接定义了GUID的值,但是MinGW的头文件中我只找到了声明却没有找到定义。
请问各位大神,MinGW的GUID应该怎么用啊,除了,devguid.h、initguid.h还需要包含什么文件?谢谢。
已解决,MinGW在使用WindowsAPI时除了包含头文件还需要链接库。
GUID需要连接libuuid.a。 展开
这个程序在Visual 2015上是可以编译通过正常运行的,而且Visual Studio的devguid.h和Mingw的不太一样,Visual Studio的devguid.h文件中直接定义了GUID的值,但是MinGW的头文件中我只找到了声明却没有找到定义。
请问各位大神,MinGW的GUID应该怎么用啊,除了,devguid.h、initguid.h还需要包含什么文件?谢谢。
已解决,MinGW在使用WindowsAPI时除了包含头文件还需要链接库。
GUID需要连接libuuid.a。 展开
2个回答
展开全部
如果是系统的标准设备,可以在devguid.h文件中找到所对应的guid值,但如果是其它安装的驱动则可以查看其classguid值(系统设备也可以),如:
USB的guid值可以在注册表路径:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/
里面找到值{36fc9e60-c465-11cf-8056-444553540000}
其对应的classguid值为:
{0x36fc9e60L, 0xc465, 0x11cf, 0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}
对比下就可以用这两个字符串相互转换了。
devguid.h中设备类型guid的定义:
GUID_DEVCLASS_FDC 软盘控制器
GUID_DEVCLASS_DISPLAY 显示卡
GUID_DEVCLASS_CDROM 光驱
GUID_DEVCLASS_KEYBOARD 键盘
GUID_DEVCLASS_COMPUTER 计算机
GUID_DEVCLASS_SYSTEM 系统
GUID_DEVCLASS_DISKDRIVE 磁盘驱动器
GUID_DEVCLASS_MEDIA 声音、视频和游戏控制器
GUID_DEVCLASS_MODEM MODEM
GUID_DEVCLASS_MOUSE 鼠标和其他指针设备
GUID_DEVCLASS_NET 网络设备器
GUID_DEVCLASS_USB 通用串行总线控制器
GUID_DEVCLASS_FLOPPYDISK 软盘驱动器
GUID_DEVCLASS_UNKNOWN 未知设备
GUID_DEVCLASS_SCSIADAPTER SCSI 和 RAID 控制器
GUID_DEVCLASS_HDC IDE ATA/ATAPI 控制器
GUID_DEVCLASS_PORTS 端口(COM 和 LPT)
GUID_DEVCLASS_MONITOR 监视器
对设备管理器的查询
GUID ClassGuid = {0x96e73b6eL, 0x7a5a, 0x11d4, 0x9f, 0x24, 0x00, 0x80, 0xc8, 0x27, 0x27, 0xf4};
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
CString temp;
CString str;
hDevInfo = SetupDiGetClassDevs((LPGUID) &ClassGuid, 0, 0,DIGCF_PRESENT);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
// Insert error handling here.
return ;
}
// Enumerate through all devices in Set.
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);i++)
{
DWORD DataT;
char buffer[2048];
DWORD buffersize =sizeof(buffer);
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_DEVICEDESC,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
//if (buffer) LocalFree(buffer);
//buffer = (PSP_INF_INFORMATION)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
if (buffer != NULL && i == 0)
{
temp.Format("<光盘驱动器>");
str += temp;
}
temp.Format("<VALUE>%s</VALUE>",buffer);
str += temp;
if (buffer) LocalFree(buffer);
}
if (i != 0)
{
temp.Format("</光盘驱动器>");
str += temp;
}
if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
return ;
}
// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
USB的guid值可以在注册表路径:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/
里面找到值{36fc9e60-c465-11cf-8056-444553540000}
其对应的classguid值为:
{0x36fc9e60L, 0xc465, 0x11cf, 0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}
对比下就可以用这两个字符串相互转换了。
devguid.h中设备类型guid的定义:
GUID_DEVCLASS_FDC 软盘控制器
GUID_DEVCLASS_DISPLAY 显示卡
GUID_DEVCLASS_CDROM 光驱
GUID_DEVCLASS_KEYBOARD 键盘
GUID_DEVCLASS_COMPUTER 计算机
GUID_DEVCLASS_SYSTEM 系统
GUID_DEVCLASS_DISKDRIVE 磁盘驱动器
GUID_DEVCLASS_MEDIA 声音、视频和游戏控制器
GUID_DEVCLASS_MODEM MODEM
GUID_DEVCLASS_MOUSE 鼠标和其他指针设备
GUID_DEVCLASS_NET 网络设备器
GUID_DEVCLASS_USB 通用串行总线控制器
GUID_DEVCLASS_FLOPPYDISK 软盘驱动器
GUID_DEVCLASS_UNKNOWN 未知设备
GUID_DEVCLASS_SCSIADAPTER SCSI 和 RAID 控制器
GUID_DEVCLASS_HDC IDE ATA/ATAPI 控制器
GUID_DEVCLASS_PORTS 端口(COM 和 LPT)
GUID_DEVCLASS_MONITOR 监视器
对设备管理器的查询
GUID ClassGuid = {0x96e73b6eL, 0x7a5a, 0x11d4, 0x9f, 0x24, 0x00, 0x80, 0xc8, 0x27, 0x27, 0xf4};
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
CString temp;
CString str;
hDevInfo = SetupDiGetClassDevs((LPGUID) &ClassGuid, 0, 0,DIGCF_PRESENT);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
// Insert error handling here.
return ;
}
// Enumerate through all devices in Set.
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);i++)
{
DWORD DataT;
char buffer[2048];
DWORD buffersize =sizeof(buffer);
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_DEVICEDESC,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
//if (buffer) LocalFree(buffer);
//buffer = (PSP_INF_INFORMATION)LocalAlloc(LPTR,buffersize);
}
else
{
// Insert error handling here.
break;
}
}
if (buffer != NULL && i == 0)
{
temp.Format("<光盘驱动器>");
str += temp;
}
temp.Format("<VALUE>%s</VALUE>",buffer);
str += temp;
if (buffer) LocalFree(buffer);
}
if (i != 0)
{
temp.Format("</光盘驱动器>");
str += temp;
}
if ( GetLastError()!=NO_ERROR &&
GetLastError()!=ERROR_NO_MORE_ITEMS )
{
return ;
}
// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询