VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 817|回复: 2

[求助] error2019的问题

[复制链接]
69_avatar_middle
在线会员 发表于 2016-4-27 21:17:37 | 显示全部楼层 |阅读模式
3驿站币
  1. #include <windows.h>
  2. #include <setupapi.h>
  3. #include <stdio.h>
  4. #include <devguid.h>
  5. #include <regstr.h>
  6. /* 函数声明 */
  7. BOOL EnumPresentDevice( const GUID * InterfaceClassGuid );
  8. BOOL EnumAllDevice();
  9. /*************************************
  10. * BOOL EnumClassDevice( const GUID * InterfaceClassGuid )
  11. * 功能        根据类型列举当前存在的设备
  12. * 参数        InterfaceClassGuid,所需列举设备接口类的GUID
  13. **************************************/
  14. BOOL EnumClassDevice( const GUID * InterfaceClassGuid )

  15. {
  16.         HDEVINFO DeviceInfoSet;
  17.         HDEVINFO NewDeviceInfoSet;

  18.         SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
  19.         PSP_DEVICE_INTERFACE_DETAIL_DATA lpDeviceInterfaceDetailData;

  20.         DWORD dwBufferSize = 0;
  21.         DWORD i;
  22.         // 创建空设备信息列表
  23.         DeviceInfoSet = SetupDiCreateDeviceInfoList(NULL, NULL);

  24.         if(DeviceInfoSet == INVALID_HANDLE_VALUE)
  25.         {
  26.                 printf("CreateDeviceInfoList failed: %d\n", GetLastError());
  27.                 return 0;
  28.         }

  29.         // 根据接口类型获得新的设备信息列表

  30.         NewDeviceInfoSet = SetupDiGetClassDevsEx(
  31.                 InterfaceClassGuid,
  32.                 NULL,
  33.                 NULL,
  34.                 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE,
  35.                 DeviceInfoSet,// 之前创建的设备信息列表
  36.                 NULL,
  37.                 NULL
  38.                 );
  39.         if(NewDeviceInfoSet == INVALID_HANDLE_VALUE)
  40.         {
  41.                 printf( "SetupDiGetClassDevsEx failed: %d\n", GetLastError() );
  42.                 return 0;
  43.         }
  44.         // 设置 SP_DEVICE_INTERFACE_DATA 大小
  45.         DeviceInterfaceData.cbSize
  46.                 = sizeof(SP_DEVICE_INTERFACE_DATA);

  47.         for (i=0; ;i++)
  48.         {
  49.                 // 列举接口信息
  50.                 BOOL bResult = SetupDiEnumDeviceInterfaces(
  51.                         NewDeviceInfoSet,
  52.                         NULL,
  53.                         InterfaceClassGuid,
  54.                         i,
  55.                         &DeviceInterfaceData
  56.                         );
  57.                 if(!bResult)
  58.                 {
  59.                         if ( GetLastError()!=NO_ERROR &&
  60.                                 GetLastError()!=ERROR_NO_MORE_ITEMS )
  61.                         {
  62.                                 printf("ERROR: (%d)",GetLastError());
  63.                                 return FALSE;
  64.                         }
  65.                         break;
  66.                 }
  67.                 else
  68.                 {
  69.                         // 为PSP_DEVICE_INTERFACE_DETAIL_DATA结构分配内存,填充
  70.                         lpDeviceInterfaceDetailData =(PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(
  71.                                 GetProcessHeap(), 0,
  72.                                 sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA));
  73.                         lpDeviceInterfaceDetailData->cbSize
  74.                                 = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
  75.                         dwBufferSize = lpDeviceInterfaceDetailData->cbSize;
  76.                         // 获得接口详细信息
  77.                         while(!SetupDiGetDeviceInterfaceDetail(
  78.                                 NewDeviceInfoSet,
  79.                                 &DeviceInterfaceData,
  80.                                 lpDeviceInterfaceDetailData,
  81.                                 dwBufferSize,
  82.                                 &dwBufferSize,
  83.                                 NULL))
  84.                         {
  85.                                 // 如果内存空间不足,再次分配,直到可以成功调用
  86.                                 if(ERROR_INSUFFICIENT_BUFFER==GetLastError())
  87.                                 {
  88.                                         lpDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapReAlloc(
  89.                                                 GetProcessHeap(), 0,
  90.                                                 lpDeviceInterfaceDetailData, dwBufferSize);
  91.                                         lpDeviceInterfaceDetailData->cbSize
  92.                                                 = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
  93.                                 }               
  94.                         }
  95.                         // 显示信息
  96.                         printf("DevicePath: %s\n",lpDeviceInterfaceDetailData->DevicePath);
  97.                         // lpDeviceInterfaceDetailData->DevicePath可作为CreateFile的参数,进行IO控制
  98.                        
  99.                         // 释放内存
  100.                         HeapFree(GetProcessHeap(),0,lpDeviceInterfaceDetailData);
  101.                 }
  102.         }
  103.         SetupDiDestroyDeviceInfoList(DeviceInfoSet);
  104.         return TRUE;
  105. }
  106. /*************************************
  107. * BOOL EnumAllDevice( )
  108. * 功能        列举当前存在的设备
  109. * 返回值        是否成功
  110. **************************************/
  111. BOOL EnumAllDevice()
  112. {
  113.         HDEVINFO hDevInfo;
  114.         SP_DEVINFO_DATA DeviceInfoData;
  115.         DWORD i;

  116.         printf("Displaying the Installed Devices\n\n");

  117.         // 得到所有设备 HDEVINFO
  118.         hDevInfo = SetupDiGetClassDevs(NULL,
  119.                 0, // 无类型
  120.                 0, // 无回调函数
  121.                 DIGCF_PRESENT | DIGCF_ALLCLASSES );
  122.         if (hDevInfo == INVALID_HANDLE_VALUE)
  123.         {
  124.                 return FALSE;
  125.         }
  126.         // 循环列举
  127.         DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
  128.         for (i=0;SetupDiEnumDeviceInfo(hDevInfo,i,
  129.                 &DeviceInfoData);i++)
  130.         {
  131.                 DWORD DataT;
  132.                 LPTSTR buffer = NULL;
  133.                 DWORD buffersize = 0;

  134.                 // 获取详细信息
  135.                 while (!SetupDiGetDeviceRegistryProperty(
  136.                         hDevInfo,
  137.                         &DeviceInfoData,
  138.                         SPDRP_DEVICEDESC,
  139.                         &DataT,
  140.                         (PBYTE)buffer,
  141.                         buffersize,
  142.                         &buffersize))
  143.                 {
  144.                         if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
  145.                         {
  146.                                 // 内存不足
  147.                                 if (buffer) HeapFree(GetProcessHeap(), 0, buffer);
  148.                                 buffer = (LPTSTR)HeapAlloc(GetProcessHeap(), 0,  buffersize);
  149.                         }
  150.                         else
  151.                                 break;
  152.                 }
  153. // 输出
  154.                 printf("GUID:{%.8X-%.4X-%.4X--%.2X%.2X-%.2X%.2X%.2X%.2X%.2X%.2X} "
  155.                         "Device: %s\n",
  156.                         DeviceInfoData.ClassGuid.Data1,
  157.                         DeviceInfoData.ClassGuid.Data2,
  158.                         DeviceInfoData.ClassGuid.Data3,
  159.                         DeviceInfoData.ClassGuid.Data4[0],
  160.                         DeviceInfoData.ClassGuid.Data4[1],
  161.                         DeviceInfoData.ClassGuid.Data4[2],
  162.                         DeviceInfoData.ClassGuid.Data4[3],
  163.                         DeviceInfoData.ClassGuid.Data4[4],
  164.                         DeviceInfoData.ClassGuid.Data4[5],
  165.                         DeviceInfoData.ClassGuid.Data4[6],
  166.                         DeviceInfoData.ClassGuid.Data4[7],buffer);

  167.                 if (buffer) HeapFree(GetProcessHeap(), 0, buffer);
  168.         }

  169.         if ( GetLastError()!=NO_ERROR &&
  170.                 GetLastError()!=ERROR_NO_MORE_ITEMS )
  171.         {
  172.                 return FALSE;
  173.         }
  174.         //  释放
  175.         SetupDiDestroyDeviceInfoList(hDevInfo);
  176.         return TRUE;
  177. }

  178. int main( int argc, char *argv[ ], char *envp[ ] )
  179. {
  180.         // 列举所有设备
  181.         printf("Enumerating All Device\n\n");
  182.         EnumAllDevice();
  183.         // 列举磁盘分卷驱动器设备
  184.         printf("\n\nEnumerating Present Volume \n\n");
  185.         EnumClassDevice(&GUID_DEVINTERFACE_VOLUME);
  186.         return 0;
  187. }
复制代码


代码是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这个已经试过,无用。

最佳答案

查看完整内容

搜索 SetupDiCreateDeviceInfoList 函数,定位到MSDN: https://technet.microsoft.com/zh-cn/subscriptions/ff550956 确认其 LIB 文件是: Setupapi.lib 链接进去试试?




上一篇:客户程序指的什么,相对的还有什么程序
下一篇:C文件 与C++文件 如何混合编译?
51_avatar_middle
online_admins 发表于 2016-4-27 21:17:38 | 显示全部楼层
搜索 SetupDiCreateDeviceInfoList 函数,定位到MSDN:
https://technet.microsoft.com/zh-cn/subscriptions/ff550956

确认其 LIB 文件是:
Setupapi.lib

链接进去试试?
69_avatar_middle
ico_lz  楼主| 发表于 2016-4-29 09:29:44 | 显示全部楼层
Syc 发表于 2016-4-28 15:31
搜索 SetupDiCreateDeviceInfoList 函数,定位到MSDN:
https://technet.microsoft.com/zh-cn/subscriptio ...

谢谢!!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-5-25 04:19

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表