最近搞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个弯才能找到对应的,效率太低了。如果真的没有现成的话,我就写出来和大家共享好了!!!

解决方案 »

  1.   

    Delphi应该是没有封装这些API的,在网上看到有些人是直接将setupapi.h转成setupapi.pas的,也不是很完整。楼主还是自己去转吧,到时记得将代码贴出来 :)
      

  2.   

    当然有现成的
    你去找就是
    JEDI的Win32API实比较完整的
      

  3.   

    JEDI应该有你想要的API,够全
    http://jedi-apilib.sourceforge.net/
      

  4.   

    呵呵,原来还有这么好的东西
    ftp://delphi-jedi.org/api/setupapi.zip
    ftp://delphi-jedi.org/api/hid.zip
      

  5.   

    今天上午一边在查资料一边在改写setupapi.h和hid.h,应该写的差不多了,这个程序的准备工作还没有做好,等到做的差不多了就和大家上来分享一下,最近没怎么上网,也不知道从那里看到自己的可用分了,如果分多的话就给大家分了,人人都会有分的。呵呵!!!
      

  6.   

    JEDI 是有不少,如果没有,就只能自己写了,写多几个,也就熟练了
      

  7.   

    ftp://delphi-jedi.org/
    是一个不错的网址.
      

  8.   

    大家提供的网址真的很有用处,我不但找到了需要的API函数,而且找到别人做好的一个封装,我先拿来用用,呵呵……
    刚刚发现了一个问题,想要那出来和大家讨论讨论。
    对于一个API函数的翻译我做的和别人做的不同,我不知道有什么优劣?
    函数需要传入一个参数,我自己翻译的时候用的这种形式
    procedure Hidd_GetHidGuid(const MyGuid : PGUID);
    PGUID = ^ TGUID;
    而我看别人直接这么写的
    procedure Hidd_GetHidGuid(var MyGuid : TGUID);
    执行结果是一样的,但是我感觉我得写法可能更好一些,不知道各位是怎么个看法。
      

  9.   

    数月前kingron说过,用api就应该想到jedi
      

  10.   

    但是我感觉我得写法可能更好一些,不知道各位是怎么个看法。
    -------------------------------------------------------
    我也觉得你的比较好,因为更加原滋原味。其实C++接口也可以定义成:
    void Hidd_GetHidGuid(GUID &MyGuid);但是别人就没有这样写,呵呵。
      

  11.   

    现在API函数能够用了,但是从c翻译过来一段代码执行一下,总是告诉我找不到HID设备,各位有没有调试通过的关于usb的代码,贴出来让小弟参考一下。
      

  12.   

    procedure Hidd_GetHidGuid(const MyGuid : PGUID);
    procedure Hidd_GetHidGuid(var MyGuid : TGUID);这两种写法区别基本上就有一点:
    前者不限制传空指针..
    后者则是假定参数一定引用有效地址.
    我个人认为,就这个API,后者更好表达用途些.
      

  13.   

    晚了一步,同意halfdream(哈欠)
      

  14.   

    弄了半天就是找不到我的USB设备,SetupDiEnumDeviceInterfaces返回的总是错误,通过GetLastError看到的259,上网查了一下,同样错误的情况n多,好像都是说GUID给错了,我觉得我得情况可能也是因为这个,但是我得GUID是通过Hidd_GetHidGuid得到的,那么说罪魁祸首就是最基本的这个函数了,不知道各位高手有没有做过这方面的东西,说说那里需要主义,那里容易出现问题?
      

  15.   

    Hidd_GetHidGuid在我机器上返回的GUID是错误的,同事的几台机器也是,不知道各位运行的结果是怎么样,能够贴上来吗?
      

  16.   

    我已经能够正确地打开设备的文件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;
      

  17.   

    在我机器上能够执行到“打开设备文件成功”,但是无论我想要得到更多的设备信息,或者是往设备文件写入一些数据,都会出错,用GetLastError来看,写数据的时候提示87,说我有不合法的参数。invalid parameter ;如果我要得到更多信息的话,有出现50,说是netword not support,郁闷极了,不知道该怎么办了,各位帮忙给看看吧,如果大家想要调试的话,可以包含进去老之给的那两个文件。uses hid, setupapi;