winbile
驱动牛犊
驱动牛犊
  • 注册日期2008-01-05
  • 最后登录2008-02-01
  • 粉丝1
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:4264回复:5

VC++编写U盘通信程序时WriteFile返回错误?

楼主#
更多 发布于:2008-01-05 11:21
在和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时还错了?

请问下各位这是什么原因?
感谢你的任何回复。
有志者,事竟成。
llss2007
驱动小牛
驱动小牛
  • 注册日期2007-09-25
  • 最后登录2010-03-16
  • 粉丝5
  • 关注0
  • 积分1001分
  • 威望123点
  • 贡献值0点
  • 好评度112点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-01-08 08:48
端点0是默认控制端点,你的问题好像与端点无关,而是你的WriteFile()的第2个参数类型不对,函数要求的是LPVOID类型的应用程序传递给驱动程序的缓冲区地址。
在交流中前进
winbile
驱动牛犊
驱动牛犊
  • 注册日期2008-01-05
  • 最后登录2008-02-01
  • 粉丝1
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-01-09 13:06
LPCVOID的定义为
typedef CONST void far      *LPCVOID;
把char *应该可以隐式的转换到const void *

所以我想可能是句柄hCom的问题
有志者,事竟成。
basen99
驱动牛犊
驱动牛犊
  • 注册日期2008-03-17
  • 最后登录2014-06-23
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-04-10 10:09
 
gcc312628334417
驱动牛犊
驱动牛犊
  • 注册日期2008-03-16
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分630分
  • 威望65点
  • 贡献值1点
  • 好评度64点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-04-10 10:45
  hHCDev = CreateFile(HCName,
                            GENERIC_WRITE,
                            FILE_SHARE_WRITE,
                            NULL,
                            OPEN_EXISTING,
                            0,
                            NULL);
gcc312628334417
驱动牛犊
驱动牛犊
  • 注册日期2008-03-16
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分630分
  • 威望65点
  • 贡献值1点
  • 好评度64点
  • 原创分0分
  • 专家分0分
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);
}
游客

返回顶部