{
DWORD accessMode = 0, shareMode = 0;
HANDLE hDevice;
ULONG returned = 0,bResult = 0;
DWORD dwError;
shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; // default
accessMode = GENERIC_WRITE | GENERIC_READ; // default
if(szDriveName == 0)
{
return FALSE;
}
CString vol_string = "\\\\.\\A:";
vol_string.SetAt(4, szDriveName);
TRACE("%s",vol_string);
hDevice = CreateFile(vol_string,accessMode,shareMode,NULL,OPEN_EXISTING,0,NULL);
if(hDevice == INVALID_HANDLE_VALUE)
{
CString debugInfo;
dwError = GetLastError();
debugInfo.Format("error = %d ", dwError);
TRACE("IOCTL_STORAGE_EJECT_MEDIA errorcode = %d \n", dwError);
return FALSE;
}
bResult = DeviceIoControl(hDevice,IOCTL_STORAGE_EJECT_MEDIA,NULL,0, NULL,0,&returned, NULL);
if(!bResult) // IOCTL failed //经实验,有时虽然失败了,U盘还是能弹出
{
CString debugInfo;
dwError = GetLastError();
debugInfo.Format("error = %d ", dwError);
TRACE("IOCTL_STORAGE_EJECT_MEDIA errorcode = %d \n", dwError);
}
bResult = CloseHandle(hDevice);
if(!bResult)
{
CString debugInfo;
dwError = GetLastError();
debugInfo.Format("error = %d ", dwError);
TRACE("IOCTL_STORAGE_EJECT_MEDIA errorcode = %d \n", dwError);
return FALSE;
}
return TRUE;
}
这个函数在按钮的实现中,即把卷标传入即可:
void CUSBTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
UnInstallUsb((char)g_strVolume.GetAt(0));
}
(4)需要的读取卷标和写入的函数。
void CUSBTestDlg::JudgeDeviceChangePath(DWORD dwData, CString &strPath)
{
for(int i=0;i<32;i++)
{
if(dwData&0x01)
{
//获取盘符
CString str=char('A'+i);
strPath+=str;
break;
}
dwData = dwData>>1;
if(dwData==0x0000)
break;
}
}
void CUSBTestDlg::IOFileToMobileDevice(CString str)
{
FILE* stream = NULL;
char paramfilepath[200];