阅读:3277回复:12
求教:VC应用程序怎样和USB驱动程序进行通信?现在,我用DriverWork开发了一个USB驱动程序,USB硬件是用 Philip的pdiusbd12接口芯片,应用程序是用VC++编写的. 目前的问题是:VC应用程序怎样和驱动程序进行通信? 希望高手们能指教一些! 非常感激!!! 徐 |
|
最新喜欢:tmgui0... |
沙发#
发布于:2002-01-18 22:47
|
|
|
板凳#
发布于:2002-01-19 09:08
如果你是用向导做的话,DS也生成了一个测试程序,你还可以用下面着个函数打开
HANDLE GetDeviceViaInterface( GUID* pGuid, DWORD instance) { // Get handle to relevant device information set HDEVINFO info = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); if(info==INVALID_HANDLE_VALUE) { printf(\"No HDEVINFO available for this GUID\\n\"); return NULL; } // Get interface data for the requested instance SP_INTERFACE_DEVICE_DATA ifdata; ifdata.cbSize = sizeof(ifdata); if(!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, instance, &ifdata)) { printf(\"No SP_INTERFACE_DEVICE_DATA available for this GUID instance\\n\"); SetupDiDestroyDeviceInfoList(info); return NULL; } // Get size of symbolic link name DWORD ReqLen; SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &ReqLen, NULL); PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]); if( ifDetail==NULL) { SetupDiDestroyDeviceInfoList(info); return NULL; } // Get symbolic link name ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if( !SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL, NULL)) { SetupDiDestroyDeviceInfoList(info); delete ifDetail; return NULL; } printf(\"Symbolic link is %s\\n\",ifDetail->DevicePath); // Open file HANDLE rv = CreateFile( ifDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( rv==INVALID_HANDLE_VALUE) rv = NULL; delete ifDetail; SetupDiDestroyDeviceInfoList(info); return rv; } |
|
|
地板#
发布于:2002-01-20 17:55
非常感激!
但是,我还是不太明白?acx能否再讲详细些和完整些,具体应该怎样做? 非常感激! 徐 |
|
地下室#
发布于:2002-01-21 09:21
他已经说的很明白了,就是通过GUID/CreateFile打开device,用DeviceIoControl/ReadFile/WriteFile和device通讯,最后用CloseHandle关闭和device的连接。
|
|
|
5楼#
发布于:2002-01-21 09:41
各位:
早好,我想说的是这段代码我也使用过,但它是检测HID设备的啊. |
|
6楼#
发布于:2002-01-21 09:52
各位:
对不起,我收回我的发言.它可以检测到USB设备. |
|
7楼#
发布于:2002-01-21 09:54
所有用GUID注册过接口的驱动程序应该都可以用。
|
|
|
8楼#
发布于:2002-01-21 09:57
如果你是不太明白我建议你读读Chris Cant 的《windows wdm》的第5章
|
|
|
9楼#
发布于:2002-01-21 10:01
上面的同事:
这本书在哪里可以卖到呢? |
|
10楼#
发布于:2002-01-22 08:36
各位大侠:
请看看我这段代码,这段代码是用VC检测我的PALM机,GUID是我的PLAM机CLASSGUID(我从注册表中找到的),但程序运行不能通过,检测不到我的PALM机,请大家帮我分析原因,代码如下: HDEVINFO INFO; SP_INTERFACE_DEVICE_DATA INFODATA; PSP_DEVICE_INTERFACE_DATA PINFODATA; PSP_INTERFACE_DEVICE_DETAIL_DATA PINFODATADETAIL; DWORD NeedLength=512; HINSTANCE hInst=AfxGetApp()->m_hInstance; GUID pGuid={0x4D36E978,0xE325,0x11CE,{0xBF,0xC1,0x08,0x00,0x2B,0xE1,0x03,0x18}}; INFO=SetupDiGetClassDevs(&pGuid,NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE); if(INFO==INVALID_HANDLE_VALUE) { plist->AddString(\"NO HDEVINFO available for this GUID\\n\"); return; } INFODATA.cbSize=sizeof(INFODATA); if(!SetupDiEnumDeviceInterfaces(INFO,NULL,&pGuid,0,&INFODATA)) { plist->AddString(\"NO SP_INTERFACE_DEVICE_DATA available for this GUID instance\\n\"); SetupDiDestroyDeviceInfoList(INFO); return; } plist->AddString(\"Success\"); SetupDiGetDeviceInterfaceDetail(INFO,&INFODATA,NULL,0,&NeedLength,NULL); PINFODATADETAIL=(PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(NeedLength); if(PINFODATADETAIL==NULL) { plist->AddString(\"NO PSP_INTERFACE_DEVICE_DETAIL_DATA\\n\"); SetupDiDestroyDeviceInfoList(INFO); return; } INFODATA.cbSize=sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if(!SetupDiGetDeviceInterfaceDetail(INFO,&INFODATA,PINFODATADETAIL,NeedLength,NULL,NULL)) { plist->AddString(\"Fail\");//程序运行到这里失败 SetupDiDestroyDeviceInfoList(INFO); return; } plist->AddString(PINFODATADETAIL->DevicePath); |
|
11楼#
发布于:2002-01-23 10:23
如果是驱动主动发数据给应用程序怎么做?
|
|
|
12楼#
发布于:2002-04-24 21:44
PALM HANDHELD PLEASE PHONE (0755)2388065 Mr.caojun
|
|