阅读:4264回复:5
VC++编写U盘通信程序时WriteFile返回错误?
在和U盘通信时,WriteFile调用返回错误,大致代码如下:
DWORD WriteRet = 0; BOOL WriteSuccess = FALSE; HANDLE hCom = CreateFile (strtDetailData-> DevicePath,GENERIC_READ ¦ GENERIC_WRITE,FILE_SHARE_READ ¦ FILE_SHARE_WRITE,NULL, OPEN_EXISTING, 0, NULL); if (hCom == INVALID_HANDLE_VALUE){ return; } WriteSuccess = WriteFile(hCom, "ABC", 4, &WriteRet, NULL); CreateFile()返回了一个U盘的句柄 但WriteFile返回0,使用GetLastError()返回的值是87,查看相关的错误定义可以知道87表示:The parameter is incorrect. 这里哪个参数用错了么? 在网上看到说默认打开的0端点,为何WriteFile时还错了? 请问下各位这是什么原因? 感谢你的任何回复。 |
|
|
沙发#
发布于:2008-01-08 08:48
端点0是默认控制端点,你的问题好像与端点无关,而是你的WriteFile()的第2个参数类型不对,函数要求的是LPVOID类型的应用程序传递给驱动程序的缓冲区地址。
|
|
|
板凳#
发布于:2008-01-09 13:06
LPCVOID的定义为
typedef CONST void far *LPCVOID; 把char *应该可以隐式的转换到const void * 所以我想可能是句柄hCom的问题 |
|
|
地板#
发布于:2008-04-10 10:09
|
|
驱动牛犊
|
地下室#
发布于:2008-04-10 10:45
hHCDev = CreateFile(HCName,
GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); |
驱动牛犊
|
5楼#
发布于:2008-04-10 10:50
void CTestUSBDlg::ShowUdisk()
{ int k = 0; DWORD MaxDriveSet, CurDriveSet; DWORD drive, drivetype; TCHAR szBuf[300]; HANDLE hDevice; PSTORAGE_DEVICE_DESCRIPTOR pDevDesc; char* p; CString str; for(k=0; k<26; k++) szMoveDiskName[k] = '\0'; k = 1; MaxDriveSet = CurDriveSet = 0; MaxDriveSet = GetLogicalDrives(); CurDriveSet = MaxDriveSet; for ( drive = 0; drive < 32; ++drive ) { if ( MaxDriveSet & (1 << drive) ) { DWORD temp = 1<<drive; _stprintf( szDrvName, _T("%c:\\"), 'A'+drive ); if(GetDriveType( szDrvName )== DRIVE_REMOVABLE) { drivetype = DRVREMOVE; sprintf(szBuf, "\\\\?\\%c:", 'A'+drive); hDevice = CreateFile(szBuf, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); if (hDevice != INVALID_HANDLE_VALUE) { pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1]; pDevDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1; if(GetDisksProperty(hDevice, pDevDesc)) { szMoveDiskName[k] = chFirstDriveFromMask(temp); szMoveDiskName[0]=k; k++; ShowMessage("\r\n找到U盘,名称:\r\n"); p= (char*)pDevDesc; str = (pDevDesc->VendorIdOffset ? &p[pDevDesc->VendorIdOffset]:"(NULL)"); ShowMessage(str); ShowMessage("\r\n产品ID:\r\n"); str=(pDevDesc->ProductIdOffset ? &p[pDevDesc->ProductIdOffset]:"(NULL)"); ShowMessage(str); ShowMessage("\r\n产品版本:\r\n"); str = (pDevDesc->ProductRevisionOffset ? &p[pDevDesc->ProductRevisionOffset] : "(NULL)"); ShowMessage(str); ShowMessage("\r\n序列号:\r\n"); str = (pDevDesc->SerialNumberOffset ? &p[pDevDesc->SerialNumberOffset] : "(NULL)"); ShowMessage(str); } delete pDevDesc; CloseHandle(hDevice); } } } } str.Format("\r\n U盘符:\r\n%s",&szMoveDiskName[1]); if(szMoveDiskName[0]==0) { str="\r\n没有U盘\r\n"; m_showMessage.Empty(); } ShowMessage(str); } |