各位大虾们好:
我在开发USB遇到以下问题,望那位大虾能帮我解决,谢谢!!!
我用的是WIN2000 + VC++6.0 + WIN2000 DDK;
问题1:连接hid.lib库文件是用...\NTDDK\LIBCHK\I386下的,还是要用...\NTDDK\LIBFRE\I386下的?
问题2:setupapi.lib库文件是用...\NTDDK\LIBCHK\I386下的,还是要用...\NTDDK\LIBFRE\I386下的,还是用...\NTDDK\LIB\I386\free下的,还是用...\VC98\lib下的。
问题3:setupapi.h是用VC下的头文件,还是用DDK下的头文件?因为据我所知这两个头文件是不一样的。如果是用DDK下的,该怎么引用?
问题4:引用LIB文件用代码怎么引用?我是在资源文件下直接添加的。
问题5:我用下面的程序运行时,我插上U盘后,一直告诉我"抱歉,未找到可用的USB设备!"。是不是U盘不能用这种方法操作?如果是,请问我的程序打开USB的方法对不对?
问题6:如果电脑上存在其他的USB设备,会不会有影响?
问题7:我调用HidD_GetHidGuid(&HidGuid);后得到4D1E55B2-F16F-11CF-88CB-001111000030;但我在注册表中怎么也找不到,请问为什么?附:下面是我的程序。
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include <setupapi.h>#pragma comment(lib,"Setupapi.lib")extern "C"
{
#include "hidsdi.h"
}
GUID HidGuid;  // 查找本系统中HID类的GUID标识 
HidD_GetHidGuid(&HidGuid); 
//_tprintf("系统中HID类的GUID标识为:%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", 
//HidGuid.Data1,HidGuid.Data2 ,HidGuid.Data3 , 
//HidGuid.Data4[0],HidGuid.Data4[1],HidGuid.Data4[2], 
//HidGuid.Data4[3],HidGuid.Data4[4],HidGuid.Data4[5], 
//HidGuid.Data4[6],HidGuid.Data4[7]);  // 准备查找符合HID规范的USB设备 
HDEVINFO hDevInfo = SetupDiGetClassDevs(&HidGuid,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE)
{
MessageBox("符合HID规范的USB设备发生错误");
return false;
} //_tprintf("正在查找可用的USB设备...\n"); DWORD MemberIndex = 0; 
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; 
BOOL bSuccess = FALSE;  DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); 
do 
{
bSuccess = SetupDiEnumDeviceInterfaces(hDevInfo, 
NULL, 
&HidGuid, 
MemberIndex, 
&DeviceInterfaceData); 
if ((!bSuccess) && (GetLastError() == ERROR_NO_MORE_ITEMS)) 

if(MemberIndex == 0) 
MessageBox("抱歉,未找到可用的USB设备!");
else 
MessageBox("没有更多的可用的USB设备!"); SetupDiDestroyDeviceInfoList(hDevInfo); 
return false; 
} //_tprintf("找到了一个USB设备:\n"); 
//若找到了一个USB设备,则获取该设备的细节信息 
PSP_DEVICE_INTERFACE_DETAIL_DATA pDeviceInterfaceDetailData; 
DWORD Length = 0;  SetupDiGetDeviceInterfaceDetail(hDevInfo, 
&DeviceInterfaceData, 
NULL, 
0, 
&Length, 
NULL); 
pDeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(Length); 
pDeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //MUST BE!!!  if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, 
&DeviceInterfaceData, 
pDeviceInterfaceDetailData, 
Length, 
NULL, 
NULL))
MessageBox("查找路径设备时出错!");
//else 
// _tprintf("设备路径:%s\n",pDeviceInterfaceDetailData->DevicePath );  //打开设备句柄 
HANDLE hDeviceHandle = CreateFile(pDeviceInterfaceDetailData->DevicePath , 
GENERIC_READ | GENERIC_WRITE, 
FILE_SHARE_READ | FILE_SHARE_WRITE, 
NULL, 
OPEN_EXISTING, 
0, 
NULL); 
if (hDeviceHandle == INVALID_HANDLE_VALUE) 
MessageBox("打开设备路径出错!"); //释放句柄资源 
CloseHandle(hDeviceHandle);  MemberIndex++; 
}while(bSuccess);  SetupDiDestroyDeviceInfoList(hDevInfo); 
return true;
}

解决方案 »

  1.   

    DDK不会的说
    加LIB可以
    #pragma comment(lib, "ws2_32.lib")
    看看这个FAQ
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=165464
      

  2.   

    楼上的,感谢啊!
    但你说的那个例子,我早试过了,编译能通过,也能执行。但是我没插U盘前,程序运行输出一段文字;我插上U盘后,依然输出同样的文字。我不知道什么原因。能留下你的QQ吗?我们公司要我开发USB接口,催的很急。但我对USB又不太懂,麻烦你了,可不可以指点我一二。拜托!在下感激不尽。
      

  3.   

    没有仔细看你的代码,看样子像是对的,但既然你是U盘,用HidGuid打开不行吧!我以前也用CreateFile打开U盘
    GUID号为a5dcbf10-6530-11d2-901f-00c04fb951ed(Win2K下,当然也可以用盘符打开(CreateFile(“\\\\.\\X:"...)),Win98下GUID号不同,具体查看注册表。
    具体枚举设备请看..\NTDDK\src\wdm\usb\bulkusb\exe\rwbulk.c