问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

VC如何弹出U盘

发布网友 发布时间:2022-05-29 21:07

我来回答

2个回答

热心网友 时间:2024-11-25 00:34

bResult = DeviceIoControl(hDevice,
IOCTL_STORAGE_EJECT_MEDIA, //弹出U盘的具体命令。
NULL, 0, NULL, 0,&returned, NULL);

使用这个函数就可以弹出u盘

呵呵 我现在也在用vc写弹出u盘程序 可以交流下。

热心网友 时间:2024-11-25 00:34

#include <windows.h>
#include <Setupapi.h>
#include <winioctl.h>
#include <cfgmgr32.h>
#include <regstr.h>
#include <initguid.h>
#include <stdio.h>
extern "C"
{
#include "hidsdi.h"
}
DEFINE_GUID(GUID_DEVINTERFACE_DISK, 0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
DEFINE_GUID(GUID_DEVINTERFACE_CDROM, 0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
//-------------------------------------------------
DEVINST GetDrivesDevInstByDiskNumber(long DiskNumber, UINT DriveType);
//-------------------------------------------------
//-------------------------------------------------
int main(int argc, char* argv[])
{
if ( argc != 2 ) {
return 1;
}

//printf("in \n\n");

char DriveLetter = argv[1][0];
DriveLetter &= ~0x20; // uppercase

if ( DriveLetter < ''A'' || DriveLetter > ''Z'' )
{
return 1;
}

char szRootPath[] = "X:\\"; // "X:\"
szRootPath[0] = DriveLetter;

char szVolumeAccessPath[] = "\\\\.\\X:"; // "\\.\X:"
szVolumeAccessPath[4] = DriveLetter;

long DiskNumber = -1;

HANDLE hVolume = CreateFile(szVolumeAccessPath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);
if (hVolume == INVALID_HANDLE_VALUE) {
return 1;
}

STORAGE_DEVICE_NUMBER sdn;
DWORD dwBytesReturned = 0;
long res = DeviceIoControl(hVolume, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdn, sizeof(sdn), &dwBytesReturned, NULL);
if ( res ) {
DiskNumber = sdn.DeviceNumber;
}
CloseHandle(hVolume);

if ( DiskNumber == -1 ) {
return 1;
}

UINT DriveType = GetDriveType(szRootPath);

DEVINST DevInst = GetDrivesDevInstByDiskNumber(DiskNumber, DriveType);

if ( DevInst == 0 ) {
return 1;
}

ULONG Status = 0;
ULONG ProblemNumber = 0;
PNP_VETO_TYPE VetoType = PNP_VetoTypeUnknown;
WCHAR VetoNameW[MAX_PATH];
bool bSuccess = false;

res = CM_Get_Parent(&DevInst, DevInst, 0); // disk''s parent, e.g. the USB bridge, the SATA port....
res = CM_Get_DevNode_Status(&Status, &ProblemNumber, DevInst, 0);
bool IsRemovable = ((Status & DN_REMOVABLE) != 0);

for ( long tries=1; tries<=3; tries++ ) { // sometimes we need some tries...
VetoNameW[0] = 0;
if ( IsRemovable ) {
res = CM_Request_Device_EjectW(DevInst, &VetoType, VetoNameW, sizeof(VetoNameW), 0);
//res = CM_Request_Device_EjectW(DevInst, &VetoType, NULL, 0, 0); // with MessageBox or ''bubble''
} else {
res = CM_Query_And_Remove_SubTreeW(DevInst, &VetoType, VetoNameW, sizeof(VetoNameW), 0); // CM_Query_And_Remove_SubTreeA is not implemented under W2K!
}
bSuccess = (res==CR_SUCCESS && VetoType==PNP_VetoTypeUnknown);
if ( bSuccess ) {
break;
} else {
Sleep(200); // required to give the next tries a chance!
}
}

if ( bSuccess ) {
printf("Success\n\n");
return 0;
}

printf("failed\n");

printf("Result=0x%2X\n", res);

if ( VetoNameW[0] ) {
printf("VetoName=%ws)\n\n", VetoNameW);
}
return 1;
}
//-----------------------------------------------------------

//-----------------------------------------------------------
DEVINST GetDrivesDevInstByDiskNumber(long DiskNumber, UINT DriveType) {

GUID* guid;

switch (DriveType) {
case DRIVE_REMOVABLE:
//break;
case DRIVE_FIXED:
guid = (GUID*)(void*)&GUID_DEVINTERFACE_DISK;
break;
case DRIVE_CDROM:
guid = (GUID*)(void*)&GUID_DEVINTERFACE_CDROM;
break;
default:
return 0;
}

// Get device interface info set handle for all devices attached to system
HDEVINFO hDevInfo = SetupDiGetClassDevs(guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

if (hDevInfo == INVALID_HANDLE_VALUE){
return 0;
}

// Retrieve a context structure for a device interface of a device
// information set.
DWORD dwIndex = 0;
SP_DEVICE_INTERFACE_DATA devInterfaceData = {0};
devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
BOOL bRet = FALSE;

BYTE Buf[1024];
PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf;
SP_DEVICE_INTERFACE_
希望能帮上忙。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 delphi 引用头文件无法识别这两个单元winioctl, nt_status VC6.0控制台工程为什么#include&lt;windows.h&gt;后仍然提示CREATE_USN_JOU... MFC变成调用两块控制卡,头文件定义冲突,如何解决? 中山市大鲸网络科技有限公司怎么样? ...做dsp5509a的USB数据传输,但是一直出错在winnt.h和winioctl.h... 青岛大鲸网络科技有限公司怎么样? 嘉兴学习日语怎么样?高考也可以用日语的吧? winioctl.h 是什么库函数 求问c++头文件winioctl.h和windows.h分别是意思什么? 天天折扣-天天特价九块九包邮专享版怎么样 用私人移动影院看“片”会是怎样一种体验 16款丰田霸道27怎么样 丰田27霸道暖风里手热外手不热是怎么回事? 霸道27后桥半轴折了能走吗 霸道27和4000车身材质一样吗 手机照相系统中的测光:点、矩阵、中央曝光、哪个照相效果最好?_百度知 ... 求动漫美女桌面,要求与我发的图片差不多 我想要一个动漫美女的桌面主题 一个图灵测试的问题 图灵为什么被化学阉了 vb或c语言 如何屏蔽一个鼠标 C++如何用windowsAPI读取分区表 vb 下面函数如何修改获取整个硬盘容量.在线等,急用! 华天正real6410开发板wince系统重启函数是什么 VC6.0 许多扩展类的问题~DRIVE_LAYOUT_INFORMATION_EX找不到 VC++编译错误为Cannot open include file: &#39;stdafx.h&#39;: No such file... VC6.0里DISK_GEOMETRY怎么未定义 武昌鱼一般在哪里能找到? C++编译后 cl.exe错误 我发现这里问题 谁可以帮我做解答 鸡油在制作红焖武昌鱼的过程中有什么作用? 怎样在vc++中获得硬盘的序列号 即又和既又得区别是什么? 既又既又造句50字以上 既…又…既…又照句? 墨西哥城市分布特点及其原因,急 “既……又……,既……也……”的区别是什么? 水暖高手在哪里? 在线等求助水暖高手 请问水暖高手,我们家是分户式供暖,由于未缴纳取暖费现在停止供暖了,我 ... 请水暖高手指教