我已经安装了winxp ddk.在VC的Tool->Option中也已经将库所在的路径设置好了,但始终出现错误.
如果将这个函数(CM_Request_Device_Eject())不用就可以编译通过了.但usb却没办法移除了.--------------------Configuration: removusb - Win32 Debug--------------------
Compiling...
removusb.cpp
Linking...
removusb.obj : error LNK2001: unresolved external symbol __imp__CM_Request_Device_EjectA@20
Debug/removusb.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.removusb.exe - 2 error(s), 0 warning(s)代码如下:#include  <tchar.h>  
#include  <stdio.h>  
#include  <windows.h>  
#include  <devguid.h>  
 
#define  DWORD_PTR  DWORD  
#define  ULONG_PTR  DWORD  
 
 
extern  "C"  {    
#include  "hidsdi.h"    
}  
//  需加入hid.lib  
 
#include  <setupapi.h>  
//  需加入setupapi.lib  
#pragma comment(lib,"setupapi.lib") 
#include  <regstr.h>  
#include  <winbase.h>  
 
#include  <cfgmgr32.h>  
//  需要加入cfgmgr32.lib 
#pragma comment(lib,"cfgmgr32.lib") 
 
#include  <initguid.h>  
//#include  <usbiodef.h>  
DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE,  
   0xA5DCBF10L,  0x6530,  0x11D2,  0x90,  0x1F,  0x00,  0xC0,  0x4F,  0xB9,  0x51,  0xED);  
#define  GUID_CLASS_USB_DEVICE                      GUID_DEVINTERFACE_USB_DEVICE  
 
int  main(int  argc,  _TCHAR*  argv[])  
{  
     HDEVINFO  hDevInfo;  
       
     SP_DEVINFO_DATA  DeviceInfoData;  
     DWORD  i;  
 
     //--------------------------------------------------------------------------  
     //  获取设备信息  
     hDevInfo  =  SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE,  
             0,  //  Enumerator  
             0,  
             DIGCF_PRESENT    |  DIGCF_DEVICEINTERFACE  );  
     if  (hDevInfo  ==  INVALID_HANDLE_VALUE)  {  
             //  查询信息失败  
             printf("ERROR  -  SetupDiGetClassDevs()");  
             return  1;  
     }  
     //--------------------------------------------------------------------------  
 
     //  枚举每个USB设备  
     DeviceInfoData.cbSize  =  sizeof(SP_DEVINFO_DATA);  
     for  (i=0;SetupDiEnumDeviceInfo(hDevInfo,  i,  &DeviceInfoData);i++)  
     {  
               LPTSTR  buffer  =  NULL;  
               PVOID  buffer2  =  NULL;  
               DWORD  buffersize  =  0;  
               ULONG  len;  
               CONFIGRET      cr;  
               PNP_VETO_TYPE  pnpvietotype;  
               CHAR  vetoname[MAX_PATH];  
               ULONG  ulStatus;  
               ULONG  ulProblemNumber;  
 
               cr  =  CM_Get_DevNode_Status(  &ulStatus,  
                                                                       &ulProblemNumber,  
                                                                       DeviceInfoData.DevInst,  
                                                                       0);  
               if  (  CR_SUCCESS  ==  cr  )  {  
                       printf("OK  -  CM_Get_DevNode_Status()[%d]\n",  cr);  
                       printf("OK  -  CM_Get_DevNode_Status()  sts  [%x]\n",  ulStatus);  
                       printf("OK  -  CM_Get_DevNode_Status()  pro  [%x]\n",  ulProblemNumber);  
               }  else  {  
                       printf("ERROR  -  CM_Get_DevNode_Status()[%d]\n",  cr);  
                       printf("ERROR  -  CM_Get_DevNode_Status()[%d]\n",  GetLastError());  
               }  
               //  DN_DISABLEABLE  or  DN_REMOVABLE  
               if  ((DN_DISABLEABLE  &  ulStatus  )  !=  0  )  {  
                       printf("HAS  -  DN_DISABLEABLE()[%x]\n",  DN_DISABLEABLE  &  ulStatus);  
               }  else  {  
                     continue;  
               }  
               if  ((DN_REMOVABLE  &  ulStatus  )  !=  0  )  {  
                       printf("HAS  -  DN_REMOVABLE()[%x]\n",  DN_REMOVABLE  &  ulStatus);  
               }  else  {  
                     continue;  
               }  
 
               len  =  MAX_PATH;  
               //  pnpvietotype  =  PNP_VetoDevice;    
               cr  =  CM_Request_Device_Eject(  
                                                       DeviceInfoData.DevInst,  
                                                       &pnpvietotype,  
                                                       vetoname,  
                                                       len,  
                                                       0  
                                                       );  
               if  (  CR_SUCCESS  ==  cr  )  {  
                       printf("OK  -  CM_Request_Device_Eject()[%d]\n",  cr);  
               }  else  {  
                       printf("ERROR  -  CM_Request_Device_Eject()[%d]\n",  cr);  
                       printf("ERROR  -  CM_Request_Device_Eject()[%d]\n",  GetLastError());  
               }  
 
     }  
               
               
     if  (  GetLastError()!=NO_ERROR  &&  
               GetLastError()!=ERROR_NO_MORE_ITEMS  )  
     {  
             //  Insert  error  handling  here.  
             return  1;  
     }  
               
     //    Cleanup  
     SetupDiDestroyDeviceInfoList(hDevInfo);  
 
     return  0;  
}

解决方案 »

  1.   

    To: MITSMI(REGULAR) 
    谢谢!
    一定加进去了,请问您能否在您的机器上试一下,那个代码是完整的.看是否能编译能过.
    我的系统是winxp.
      

  2.   

    To: bobob(静思--潜心研究PDF) 
    谢谢,但到底是库的什么问题呢?
    您能帮试一下吗?
    是不是还缺少了什么库?
      

  3.   

    #pragma comment(lib,"cfgmgr32.lib")试试
      

  4.   

    或者这个#pragma comment(lib,"setupapi.lib")我刚才看了,CM_Request_Device_EjectA是在setupapi里面
      

  5.   

    如果还不行的话就LoadLibrary("setupapi.dll");然后GetProcAddress
      

  6.   

    To: bobob(静思--潜心研究PDF) 
    谢谢!
    我这两个都加了啊.
    #include  <setupapi.h>  
    //  需加入setupapi.lib  
    #pragma comment(lib,"setupapi.lib") 
    #include  <regstr.h>  
    #include  <winbase.h>  
     
    #include  <cfgmgr32.h>  
    //  需要加入cfgmgr32.lib 
    #pragma comment(lib,"cfgmgr32.lib")
      

  7.   

    如果还不行的话就LoadLibrary("setupapi.dll");然后GetProcAddress那就只能这样了,绝对不会有问题了
      

  8.   

    To:
     MITSMI(REGULAR) 
    您的系统装的是什么ddk呢?用的是winxp吗?会不会是版本的差异.
    您那可以通过吗?To:bobob
    也不知您那是否也可以通过,不过那个函数(CM_Request_Device_Eject()))好象不在"setupapi.h"中,
    应该是在"cfgmgr32.h"中.但我的编译器却提示__imp__CM_Request_Device_EjectA@20 error,出了问题,多谢大家的回复.
      

  9.   

    你要把vc里面的路径设置,关于winddk的,都移到所有设置的最上面。
      

  10.   

    CM_Request_Device_Eject()不管它在那里定义,只要知道函数原形,然后
    LoadLibrary("setupapi.dll");GetProcAddress一定可以
      

  11.   

    非常感谢 saliors(正在学习中) ,我的问题就出在这里,将winddk的设置都移到最上面都ok了.非常感谢 bobob(静思--潜心研究PDF) 我也会去试一下您的方法.也非常感谢 MITSMI(REGULAR).
    马上结贴了.
    谢谢大家.