|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include <windows.h>
- #include <setupapi.h>
- #include <stdio.h>
- #include <devguid.h>
- #include <regstr.h>
- /* 函数声明 */
- BOOL EnumPresentDevice( const GUID * InterfaceClassGuid );
- BOOL EnumAllDevice();
- /*************************************
- * BOOL EnumClassDevice( const GUID * InterfaceClassGuid )
- * 功能 根据类型列举当前存在的设备
- * 参数 InterfaceClassGuid,所需列举设备接口类的GUID
- **************************************/
- BOOL EnumClassDevice( const GUID * InterfaceClassGuid )
- {
- HDEVINFO DeviceInfoSet;
- HDEVINFO NewDeviceInfoSet;
- SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
- PSP_DEVICE_INTERFACE_DETAIL_DATA lpDeviceInterfaceDetailData;
- DWORD dwBufferSize = 0;
- DWORD i;
- // 创建空设备信息列表
- DeviceInfoSet = SetupDiCreateDeviceInfoList(NULL, NULL);
- if(DeviceInfoSet == INVALID_HANDLE_VALUE)
- {
- printf("CreateDeviceInfoList failed: %d\n", GetLastError());
- return 0;
- }
- // 根据接口类型获得新的设备信息列表
- NewDeviceInfoSet = SetupDiGetClassDevsEx(
- InterfaceClassGuid,
- NULL,
- NULL,
- DIGCF_PRESENT | DIGCF_DEVICEINTERFACE,
- DeviceInfoSet,// 之前创建的设备信息列表
- NULL,
- NULL
- );
- if(NewDeviceInfoSet == INVALID_HANDLE_VALUE)
- {
- printf( "SetupDiGetClassDevsEx failed: %d\n", GetLastError() );
- return 0;
- }
- // 设置 SP_DEVICE_INTERFACE_DATA 大小
- DeviceInterfaceData.cbSize
- = sizeof(SP_DEVICE_INTERFACE_DATA);
- for (i=0; ;i++)
- {
- // 列举接口信息
- BOOL bResult = SetupDiEnumDeviceInterfaces(
- NewDeviceInfoSet,
- NULL,
- InterfaceClassGuid,
- i,
- &DeviceInterfaceData
- );
- if(!bResult)
- {
- if ( GetLastError()!=NO_ERROR &&
- GetLastError()!=ERROR_NO_MORE_ITEMS )
- {
- printf("ERROR: (%d)",GetLastError());
- return FALSE;
- }
- break;
- }
- else
- {
- // 为PSP_DEVICE_INTERFACE_DETAIL_DATA结构分配内存,填充
- lpDeviceInterfaceDetailData =(PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(
- GetProcessHeap(), 0,
- sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA));
- lpDeviceInterfaceDetailData->cbSize
- = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
- dwBufferSize = lpDeviceInterfaceDetailData->cbSize;
- // 获得接口详细信息
- while(!SetupDiGetDeviceInterfaceDetail(
- NewDeviceInfoSet,
- &DeviceInterfaceData,
- lpDeviceInterfaceDetailData,
- dwBufferSize,
- &dwBufferSize,
- NULL))
- {
- // 如果内存空间不足,再次分配,直到可以成功调用
- if(ERROR_INSUFFICIENT_BUFFER==GetLastError())
- {
- lpDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapReAlloc(
- GetProcessHeap(), 0,
- lpDeviceInterfaceDetailData, dwBufferSize);
- lpDeviceInterfaceDetailData->cbSize
- = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
- }
- }
- // 显示信息
- printf("DevicePath: %s\n",lpDeviceInterfaceDetailData->DevicePath);
- // lpDeviceInterfaceDetailData->DevicePath可作为CreateFile的参数,进行IO控制
-
- // 释放内存
- HeapFree(GetProcessHeap(),0,lpDeviceInterfaceDetailData);
- }
- }
- SetupDiDestroyDeviceInfoList(DeviceInfoSet);
- return TRUE;
- }
- /*************************************
- * BOOL EnumAllDevice( )
- * 功能 列举当前存在的设备
- * 返回值 是否成功
- **************************************/
- BOOL EnumAllDevice()
- {
- HDEVINFO hDevInfo;
- SP_DEVINFO_DATA DeviceInfoData;
- DWORD i;
- printf("Displaying the Installed Devices\n\n");
- // 得到所有设备 HDEVINFO
- hDevInfo = SetupDiGetClassDevs(NULL,
- 0, // 无类型
- 0, // 无回调函数
- DIGCF_PRESENT | DIGCF_ALLCLASSES );
- if (hDevInfo == INVALID_HANDLE_VALUE)
- {
- return FALSE;
- }
- // 循环列举
- DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
- for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
- &DeviceInfoData);i++)
- {
- DWORD DataT;
- LPTSTR buffer = NULL;
- DWORD buffersize = 0;
- // 获取详细信息
- while (!SetupDiGetDeviceRegistryProperty(
- hDevInfo,
- &DeviceInfoData,
- SPDRP_DEVICEDESC,
- &DataT,
- (PBYTE)buffer,
- buffersize,
- &buffersize))
- {
- if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
- {
- // 内存不足
- if (buffer) HeapFree(GetProcessHeap(), 0, buffer);
- buffer = (LPTSTR)HeapAlloc(GetProcessHeap(), 0, buffersize);
- }
- else
- break;
- }
- // 输出
- printf("GUID:{%.8X-%.4X-%.4X--%.2X%.2X-%.2X%.2X%.2X%.2X%.2X%.2X} "
- "Device: %s\n",
- DeviceInfoData.ClassGuid.Data1,
- DeviceInfoData.ClassGuid.Data2,
- DeviceInfoData.ClassGuid.Data3,
- DeviceInfoData.ClassGuid.Data4[0],
- DeviceInfoData.ClassGuid.Data4[1],
- DeviceInfoData.ClassGuid.Data4[2],
- DeviceInfoData.ClassGuid.Data4[3],
- DeviceInfoData.ClassGuid.Data4[4],
- DeviceInfoData.ClassGuid.Data4[5],
- DeviceInfoData.ClassGuid.Data4[6],
- DeviceInfoData.ClassGuid.Data4[7],buffer);
- if (buffer) HeapFree(GetProcessHeap(), 0, buffer);
- }
- if ( GetLastError()!=NO_ERROR &&
- GetLastError()!=ERROR_NO_MORE_ITEMS )
- {
- return FALSE;
- }
- // 释放
- SetupDiDestroyDeviceInfoList(hDevInfo);
- return TRUE;
- }
- int main( int argc, char *argv[ ], char *envp[ ] )
- {
- // 列举所有设备
- printf("Enumerating All Device\n\n");
- EnumAllDevice();
- // 列举磁盘分卷驱动器设备
- printf("\n\nEnumerating Present Volume \n\n");
- EnumClassDevice(&GUID_DEVINTERFACE_VOLUME);
- return 0;
- }
复制代码
代码是windowsAPI开发详解——函数、接口、编程实例里的
编译没问题,运行结果:
>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiCreateDeviceInfoList@8,该符号在函数 "int __cdecl EnumClassDevice(struct _GUID const *)" (?EnumClassDevice@@YAHPBU_GUID@@@Z) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiEnumDeviceInfo@12,该符号在函数 "int __cdecl EnumAllDevice(void)" (?EnumAllDevice@@YAHXZ) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiDestroyDeviceInfoList@4,该符号在函数 "int __cdecl EnumAllDevice(void)" (?EnumAllDevice@@YAHXZ) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiEnumDeviceInterfaces@20,该符号在函数 "int __cdecl EnumClassDevice(struct _GUID const *)" (?EnumClassDevice@@YAHPBU_GUID@@@Z) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiGetDeviceInterfaceDetailA@24,该符号在函数 "int __cdecl EnumClassDevice(struct _GUID const *)" (?EnumClassDevice@@YAHPBU_GUID@@@Z) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiGetClassDevsA@16,该符号在函数 "int __cdecl EnumAllDevice(void)" (?EnumAllDevice@@YAHXZ) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiGetClassDevsExA@28,该符号在函数 "int __cdecl EnumClassDevice(struct _GUID const *)" (?EnumClassDevice@@YAHPBU_GUID@@@Z) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 __imp__SetupDiGetDeviceRegistryPropertyA@28,该符号在函数 "int __cdecl EnumAllDevice(void)" (?EnumAllDevice@@YAHXZ) 中被引用
1>MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
1>D:\代码\windows_api\Debug\windows_api.exe : fatal error LNK1120: 9 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
上网查说好像是少lib文件,但是我怎么确定到底少的是哪个lib文件?
或者有其他解决方案?
改项目属性里面什么windows和console这个已经试过,无用。 |
|