FAQ上找的USB安全移除代码编译不过,哪位大侠编译通过的就帮一下我.全部代码都贴出来了,在线等.....分不够再加

xhwu3721 2005-09-30 02:21:58
我已经安装了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;
}
...全文
143 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhwu3721 2005-09-30
  • 打赏
  • 举报
回复
非常感谢 saliors(正在学习中) ,我的问题就出在这里,将winddk的设置都移到最上面都ok了.

非常感谢 bobob(静思--潜心研究PDF) 我也会去试一下您的方法.

也非常感谢 MITSMI(REGULAR).
马上结贴了.
谢谢大家.
saliors 2005-09-30
  • 打赏
  • 举报
回复
因为我看了一下,那个代码好像是我贴过来的。呵呵。
bobob 2005-09-30
  • 打赏
  • 举报
回复
CM_Request_Device_Eject()不管它在那里定义,只要知道函数原形,然后
LoadLibrary("setupapi.dll");GetProcAddress一定可以
saliors 2005-09-30
  • 打赏
  • 举报
回复
你要把vc里面的路径设置,关于winddk的,都移到所有设置的最上面。
xhwu3721 2005-09-30
  • 打赏
  • 举报
回复
To:
MITSMI(REGULAR)
您的系统装的是什么ddk呢?用的是winxp吗?会不会是版本的差异.
您那可以通过吗?

To:bobob
也不知您那是否也可以通过,不过那个函数(CM_Request_Device_Eject()))好象不在"setupapi.h"中,
应该是在"cfgmgr32.h"中.

但我的编译器却提示__imp__CM_Request_Device_EjectA@20 error,出了问题,

多谢大家的回复.
bobob 2005-09-30
  • 打赏
  • 举报
回复
如果还不行的话就LoadLibrary("setupapi.dll");然后GetProcAddress

那就只能这样了,绝对不会有问题了
MITSMI 2005-09-30
  • 打赏
  • 举报
回复
说实话,我怀疑你的库设置有点问题
如果设置正确了应该不会出现这种问题的

没办法帮你调试
库都没有怎么调试阿
xhwu3721 2005-09-30
  • 打赏
  • 举报
回复
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")
bobob 2005-09-30
  • 打赏
  • 举报
回复
如果还不行的话就LoadLibrary("setupapi.dll");然后GetProcAddress
bobob 2005-09-30
  • 打赏
  • 举报
回复
或者这个#pragma comment(lib,"setupapi.lib")

我刚才看了,CM_Request_Device_EjectA是在setupapi里面
bobob 2005-09-30
  • 打赏
  • 举报
回复
#pragma comment(lib,"cfgmgr32.lib")试试
xhwu3721 2005-09-30
  • 打赏
  • 举报
回复
To: bobob(静思--潜心研究PDF)
谢谢,但到底是库的什么问题呢?
您能帮试一下吗?
是不是还缺少了什么库?
xhwu3721 2005-09-30
  • 打赏
  • 举报
回复
To: MITSMI(REGULAR)
谢谢!
一定加进去了,请问您能否在您的机器上试一下,那个代码是完整的.看是否能编译能过.
我的系统是winxp.
bobob 2005-09-30
  • 打赏
  • 举报
回复
还是库的问题
MITSMI 2005-09-30
  • 打赏
  • 举报
回复
你确认你的库加到工程里面了?

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧