访问USB 大容量存储设备解决办法
访问USB 大容量存储设备
我想实现跟USB存储设备之间的通信,但是遇到了一些问题,比较棘手,希望指教下:
获得句柄后,
在获取错误代码的时候 发现err一直为87 ,无效的参数,设备也打开成功了,就是写不了数据,是哪里出错了呢?
------解决方案--------------------
#include "windows.h"
#include "tchar.h"
#include "iostream.h"
char * DispDriveType(int n)
{
switch(n)//关于磁盘类型的定义,在 winbase.h 中定义
{
case 0://DRIVE_UNKNOWN
return "未知磁盘";
break;
case 1://DRIVE_NO_ROOT_DIR 无法找到根目录
return "磁盘不存在";
break;
case 2://DRIVE_REMOVABLE 可移动驱动器
return "可移动磁盘";
break;
case 3://DRIVE_FIXED 固定磁盘驱动器:本地硬盘或移动硬盘
return "本地磁盘";
break;
case 4://DRIVE_REMOTE
return "网络驱动器";
break;
case 5://DRIVE_CDROM
return "CD/DVD_ROM";
break;
case 6://DRIVE_RAMDISK
return "随机存取磁盘";
break;
}
}
void main()
{
TCHAR a[256];
DWORD len=GetLogicalDriveStrings(sizeof(a)/sizeof(TCHAR),a);
cout<<"磁盘符号"<<"\t"<<"磁盘类型"<<endl;
for(TCHAR *s=a;*s;s+=_tcslen(s)+1)
{
cout<<s<<"\t\t"<<DispDriveType(GetDriveType(s))<<endl;
}
cin.get();
}
用这个得到可移动磁盘盘符,然后按楼上的用盘符操作
我想实现跟USB存储设备之间的通信,但是遇到了一些问题,比较棘手,希望指教下:
hDevHandle = CreateFile(dwDevicePath,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);
获得句柄后,
BOOL bResult;
DWORD nBytesWritten;
OVERLAPPED gOverlapped;
DWORD dwResult;
OVERLAPPED writeOS;
dwResult = MPUSB_FAIL;
Sleep(50);
// set up overlapped structure fields
memset(&gOverlapped,0,sizeof(gOverlapped));
gOverlapped.Internal = 0;
gOverlapped.InternalHigh = 0;
gOverlapped.Offset = 0;
gOverlapped.OffsetHigh = 0;
gOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if(pLength != NULL)*pLength = 0;
// attempt an asynchronous read operation
bResult = WriteFile(hDevHandle,pData,dwLen,&nBytesWritten,&gOverlapped);
DWORD err = GetLastError();
在获取错误代码的时候 发现err一直为87 ,无效的参数,设备也打开成功了,就是写不了数据,是哪里出错了呢?
------解决方案--------------------
#include "windows.h"
#include "tchar.h"
#include "iostream.h"
char * DispDriveType(int n)
{
switch(n)//关于磁盘类型的定义,在 winbase.h 中定义
{
case 0://DRIVE_UNKNOWN
return "未知磁盘";
break;
case 1://DRIVE_NO_ROOT_DIR 无法找到根目录
return "磁盘不存在";
break;
case 2://DRIVE_REMOVABLE 可移动驱动器
return "可移动磁盘";
break;
case 3://DRIVE_FIXED 固定磁盘驱动器:本地硬盘或移动硬盘
return "本地磁盘";
break;
case 4://DRIVE_REMOTE
return "网络驱动器";
break;
case 5://DRIVE_CDROM
return "CD/DVD_ROM";
break;
case 6://DRIVE_RAMDISK
return "随机存取磁盘";
break;
}
}
void main()
{
TCHAR a[256];
DWORD len=GetLogicalDriveStrings(sizeof(a)/sizeof(TCHAR),a);
cout<<"磁盘符号"<<"\t"<<"磁盘类型"<<endl;
for(TCHAR *s=a;*s;s+=_tcslen(s)+1)
{
cout<<s<<"\t\t"<<DispDriveType(GetDriveType(s))<<endl;
}
cin.get();
}
用这个得到可移动磁盘盘符,然后按楼上的用盘符操作