[[高分醒目]]关于delphi如何封装WinAPI???[[高分醒目]]

何鲁青 2006-04-08 10:31:27
最近搞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个弯才能找到对应的,效率太低了。如果真的没有现成的话,我就写出来和大家共享好了!!!
...全文
681 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
何鲁青 2006-04-21
  • 打赏
  • 举报
回复
月底结账...
AOCOC 2006-04-14
  • 打赏
  • 举报
回复
路過..
何鲁青 2006-04-13
  • 打赏
  • 举报
回复
在我机器上能够执行到“打开设备文件成功”,但是无论我想要得到更多的设备信息,或者是往设备文件写入一些数据,都会出错,用GetLastError来看,写数据的时候提示87,说我有不合法的参数。invalid parameter ;如果我要得到更多信息的话,有出现50,说是netword not support,郁闷极了,不知道该怎么办了,各位帮忙给看看吧,如果大家想要调试的话,可以包含进去老之给的那两个文件。uses hid, setupapi;
何鲁青 2006-04-13
  • 打赏
  • 举报
回复
我已经能够正确地打开设备的文件handle了,但是好像还是有问题,今天将代码贴上来,高手帮忙给看看...进来的帮忙给顶顶!!!
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;
ccrun.com 2006-04-12
  • 打赏
  • 举报
回复
眼睁睁的看着分被老之抢走了。。。
何鲁青 2006-04-12
  • 打赏
  • 举报
回复
Hidd_GetHidGuid在我机器上返回的GUID是错误的,同事的几台机器也是,不知道各位运行的结果是怎么样,能够贴上来吗?
dext 2006-04-11
  • 打赏
  • 举报
回复
晚了一步,同意halfdream(哈欠)
halfdream 2006-04-11
  • 打赏
  • 举报
回复
procedure Hidd_GetHidGuid(const MyGuid : PGUID);
procedure Hidd_GetHidGuid(var MyGuid : TGUID);

这两种写法区别基本上就有一点:
前者不限制传空指针..
后者则是假定参数一定引用有效地址.
我个人认为,就这个API,后者更好表达用途些.
何鲁青 2006-04-11
  • 打赏
  • 举报
回复
现在API函数能够用了,但是从c翻译过来一段代码执行一下,总是告诉我找不到HID设备,各位有没有调试通过的关于usb的代码,贴出来让小弟参考一下。
Tensionli 2006-04-11
  • 打赏
  • 举报
回复
凑个热闹
biao_227 2006-04-11
  • 打赏
  • 举报
回复
进来学习!
何鲁青 2006-04-11
  • 打赏
  • 举报
回复
弄了半天就是找不到我的USB设备,SetupDiEnumDeviceInterfaces返回的总是错误,通过GetLastError看到的259,上网查了一下,同样错误的情况n多,好像都是说GUID给错了,我觉得我得情况可能也是因为这个,但是我得GUID是通过Hidd_GetHidGuid得到的,那么说罪魁祸首就是最基本的这个函数了,不知道各位高手有没有做过这方面的东西,说说那里需要主义,那里容易出现问题?
rabbitweng 2006-04-10
  • 打赏
  • 举报
回复
都已经是猩猩了,还来蹭分,可怜了我们这些裤衩啊~~
mark一下
clasj 2006-04-10
  • 打赏
  • 举报
回复
但是我感觉我得写法可能更好一些,不知道各位是怎么个看法。
-------------------------------------------------------
我也觉得你的比较好,因为更加原滋原味。

其实C++接口也可以定义成:
void Hidd_GetHidGuid(GUID &MyGuid);

但是别人就没有这样写,呵呵。
hellolongbin 2006-04-10
  • 打赏
  • 举报
回复
纯蹭分
jinjazz 2006-04-10
  • 打赏
  • 举报
回复
数月前kingron说过,用api就应该想到jedi
lisypro 2006-04-10
  • 打赏
  • 举报
回复
UP
何鲁青 2006-04-10
  • 打赏
  • 举报
回复
大家提供的网址真的很有用处,我不但找到了需要的API函数,而且找到别人做好的一个封装,我先拿来用用,呵呵……
刚刚发现了一个问题,想要那出来和大家讨论讨论。
对于一个API函数的翻译我做的和别人做的不同,我不知道有什么优劣?
函数需要传入一个参数,我自己翻译的时候用的这种形式
procedure Hidd_GetHidGuid(const MyGuid : PGUID);
PGUID = ^ TGUID;
而我看别人直接这么写的
procedure Hidd_GetHidGuid(var MyGuid : TGUID);
执行结果是一样的,但是我感觉我得写法可能更好一些,不知道各位是怎么个看法。
cncharles 2006-04-09
  • 打赏
  • 举报
回复
ftp://delphi-jedi.org/
是一个不错的网址.
GARNETT2183 2006-04-08
  • 打赏
  • 举报
回复
JEDI应该有你想要的API,够全
http://jedi-apilib.sourceforge.net/
加载更多回复(11)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧