最近搞Usb相关的通信问题,在网上查资料找到了不少需要的API函数和其需要调用到的DLL,主要用到了HID.Dll和Setupapi.dll以及文件操作要调用到Kernel32.dll中的WriteFile等API函数。这些东西在VC下面很容易找(对应setupapi.h和hidsdi.h),但是在delphi中需要uses进去那些文件那???(不知道delphi有没有封装这些api函数)有没有人有这方面的资料(windowsAPI封装的对应pas文件)。给小弟一份,高分感谢!!!
另外,如果有那位高手做过usb通信方面的不妨交流一下经验。BTW:本来打算自己从.dll里面调用函数的,但是写了几个之后就觉得烦了,主要是函数太多,而且从VC里面定义的数据类型在delphi中拐8个弯才能找到对应的,效率太低了。如果真的没有现成的话,我就写出来和大家共享好了!!!
另外,如果有那位高手做过usb通信方面的不妨交流一下经验。BTW:本来打算自己从.dll里面调用函数的,但是写了几个之后就觉得烦了,主要是函数太多,而且从VC里面定义的数据类型在delphi中拐8个弯才能找到对应的,效率太低了。如果真的没有现成的话,我就写出来和大家共享好了!!!
你去找就是
JEDI的Win32API实比较完整的
http://jedi-apilib.sourceforge.net/
ftp://delphi-jedi.org/api/setupapi.zip
ftp://delphi-jedi.org/api/hid.zip
是一个不错的网址.
刚刚发现了一个问题,想要那出来和大家讨论讨论。
对于一个API函数的翻译我做的和别人做的不同,我不知道有什么优劣?
函数需要传入一个参数,我自己翻译的时候用的这种形式
procedure Hidd_GetHidGuid(const MyGuid : PGUID);
PGUID = ^ TGUID;
而我看别人直接这么写的
procedure Hidd_GetHidGuid(var MyGuid : TGUID);
执行结果是一样的,但是我感觉我得写法可能更好一些,不知道各位是怎么个看法。
-------------------------------------------------------
我也觉得你的比较好,因为更加原滋原味。其实C++接口也可以定义成:
void Hidd_GetHidGuid(GUID &MyGuid);但是别人就没有这样写,呵呵。
procedure Hidd_GetHidGuid(var MyGuid : TGUID);这两种写法区别基本上就有一点:
前者不限制传空指针..
后者则是假定参数一定引用有效地址.
我个人认为,就这个API,后者更好表达用途些.
procedure TForm1.Button1Click(Sender: TObject);
var MyGuid : TGUID;
ShowStr : String;
hHDEVINFO : HDEVINFO;
MyInterface : TSPDeviceInterfaceData;
bSuccess : Boolean;
// HCindex : Integer;
MyDetail : array[0..MAX_DETAIL_BUFF_LEN-1] of byte;
PMyDetail : PSPDeviceInterfaceDetailData;
hDevice : THandle;
MyHidAttr : THIDDAttributes;
// MyPreparData : PHIDPPreparsedData;
SendBuff : array[0..255] of char;
NumWrited : DWORD;
begin
memo1.Lines.Clear;
// HidD_GetHidGuid(MyGuid);
//这个是正确的guid:A5DCBF10-6530-11D2-901F-00C04FB951ED
MyGuid.D1 := $A5DCBF10;
MyGuid.D2 := $6530;
MyGuid.D3 := $11D2;
MyGuid.D4[0]:= $90;
MyGuid.D4[1]:= $1F;
MyGuid.D4[2]:= $00;
MyGuid.D4[3]:= $C0;
MyGuid.D4[4]:= $4F;
MyGuid.D4[5]:= $B9;
MyGuid.D4[6]:= $51;
MyGuid.D4[7]:= $ED; ShowStr := Format('本机HID类的GUID为:%x - %x - %x - %x - %x - %x - %x - %x - %x - %x - %x ',
[MyGuid.D1, MyGuid.D2, MyGuid.D3, MyGuid.D4[0], MyGuid.D4[1], MyGuid.D4[2], MyGuid.D4[3],
MyGuid.D4[4], MyGuid.D4[5], MyGuid.D4[6], MyGuid.D4[7]]);
memo1.Lines.Add(ShowStr); hHDEVINFO := SetupDiGetClassDevs(@MyGuid, nil, 0, DIGCF_DEVICEINTERFACE+DIGCF_PRESENT);
if (DWORD(hHDEVINFO) = INVALID_HANDLE_VALUE) then
begin
memo1.Lines.Add('查找接口时出错');
end
else
begin
ShowStr := Format('查找到HID类的设备接口HDEVINFO为: %x',[DWORD(hHDEVINFO)]);
memo1.Lines.Add(ShowStr); MyInterface.cbSize := sizeof(TSPDeviceInterfaceData);
bSuccess := SetupDiEnumDeviceInterfaces(hHDEVINFO, nil, MyGuid, 0, MyInterface);
if not bSuccess then
begin
ShowStr := Format('查找USB设备接口失败,原因代码:%d', [GetLastError]);
memo1.Lines.Add(ShowStr);
SetupDiDestroyDeviceInfoList(hHDEVINFO);
end
else
begin
memo1.Lines.Add('查找USB设备接口成功^_^'); ZeroMemory(@MyDetail, MAX_DETAIL_BUFF_LEN);
PMyDetail := @MyDetail;
PMyDetail.cbSize := sizeof(TSPDeviceInterfaceDetailData);
if not SetupDiGetDeviceInterfaceDetail(hHDEVINFO, @MyInterface, @MyDetail, MAX_DETAIL_BUFF_LEN, nil, nil) then
begin
ShowStr := Format('查找设备路径时出错,原因代码:%d', [GetLastError]);
memo1.Lines.Add(ShowStr);
SetupDiDestroyDeviceInfoList(hHDEVINFO);
end
else
begin
ShowStr := Format('可以通过路径:%s 来访问设备', [PMyDetail.DevicePath]);
memo1.Lines.Add(ShowStr); hDevice := CreateFile(PMyDetail.DevicePath,
GENERIC_READ + GENERIC_WRITE,//读写模式
0,//dwShareMode:object cannot be shared
nil,//lpSecurityAttributes
OPEN_EXISTING,//dwCreationDistribution
FILE_ATTRIBUTE_NORMAL ,//dwFlagsAndAttributes
0);
if hDevice = INVALID_HANDLE_VALUE then
begin
ShowStr := Format('打开设备的时候出现错误,错误代码:%d', [GetLastError]);
memo1.Lines.Add(ShowStr);
SetupDiDestroyDeviceInfoList(hHDEVINFO);
end
else
begin
memo1.Lines.Add('打开设备文件成功!'); FillChar(SendBuff, sizeof(SendBuff),1);
NumWrited := 0;
{ if not WriteFile(hDevice, SendBuff, sizeof(SendBuff), NumWrited, nil) then
begin
ShowStr := Format('%d', [GetLastError]);
Memo1.Lines.Add('Error in Writing' + ShowStr);
if NumWrited <> 0 then
showmessage('???');
end;
}
//{
ZeroMemory(@MyHidAttr, sizeof(MyHidAttr));
MyHidAttr.Size := sizeof(THIDDAttributes);
if not HidD_GetAttributes(hDevice, MyHidAttr) then
begin
ShowStr := Format('读取设备状态出错,错误代码:%d', [GetLastError]);
memo1.Lines.Add(ShowStr);
CloseHandle(hDevice);
SetupDiDestroyDeviceInfoList(hHDEVINFO);
end
else
begin
memo1.Lines.Add('读取设备状态成功,信息如下:');
ShowStr := Format('供应商ID:0x%x', [MyHidAttr.VendorID]);
memo1.Lines.Add(ShowStr);
ShowStr := Format('产品标识:0x%x', [MyHidAttr.ProductID]);
memo1.Lines.Add(ShowStr);
ShowStr := Format('产品版本号:%d', [MyHidAttr.VersionNumber]);
memo1.Lines.Add(ShowStr); CloseHandle(hDevice);
SetupDiDestroyDeviceInfoList(hHDEVINFO);
end;
//}
{
if not HidD_GetPreparsedData(hDevice, MyPreparData) then
begin
ShowStr := Format('获取PreParData失败,错误代码:%d', [GetLastError]);
memo1.Lines.Add(ShowStr);
CloseHandle(hDevice);
SetupDiDestroyDeviceInfoList(hHDEVINFO);
end
else
begin
memo1.Lines.Add('正确获取PreParseData!');
end;
}
end;
end;
end;
end;
end;