VC dll 接口格式#ifndef HUSBRF_H  
#define HUSBRF_H  extern "C"  
{       _declspec(dllexport) HANDLE OpenHIDDev();  
     _declspec(dllexport) bool CloseHIDDev(HANDLE HIDHandle);  
     _declspec(dllexport) bool WriteHIDDev(HANDLE HIDHandle,WORD m_Uid,BYTE m_PipeData,BYTE m_CodeWidth,BYTE m_RptCnt,BYTE m_DelayTime); 
     _declspec(dllexport) bool WriteHIDDevEx(HANDLE HIDHandle,BYTE OutputReport[9]);  
}  
1、Delphi 内的调用代码
unit UfrmMain;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TOpenHIDDev=function():Pointer;stdcall;
  TCloseHIDDev=function(handle:Pointer):Boolean;stdcall;
  TWriteHIDDev=function(handle:Pointer;uid:WORD; pipeData,codeWith,rptCnt,DelayTime:Byte):Boolean;stdcall;
 
  TForm1 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    btn4: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    handle:THandle;
  end;var
  Form1: TForm1;
  Handle:THandle;
  DevHle:Pointer;
  OpenHIDDev:TOpenHIDDev;
  CloseHIDDev:TCloseHIDDev;
  WriteHIDDev:TWriteHIDDev;implementation{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);
begin
  DevHle := OpenHIDDev();
end;procedure TForm1.btn4Click(Sender: TObject);
begin
  CloseHIDDev(DevHle);
end;procedure TForm1.btn2Click(Sender: TObject);
begin
  WriteHIDDev(DevHle,4660,0,2,0,0);
end;procedure TForm1.btn3Click(Sender: TObject);
begin
  WriteHIDDev(DevHle,4660,0,2,10,0);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  Handle:=LoadLibrary('USBRF.dll');
  if Handle = 0 then
    MessageDlg('缺少接口Dll文件',  mtError, [mbOK], 0);
  @OpenHIDDev  :=GetProcAddress(Handle,'OpenHIDDev');
  @CloseHIDDev :=GetProcAddress(Handle,'CloseHIDDev');
  @WriteHIDDev :=GetProcAddress(Handle,'WriteHIDDev');end;procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeLibrary(Handle);
end;end.
静态调用的方式也尝试过,问题一样。
问题是OpenHIDDev 的时候 是正常的,执行WriteHIDDev 的时候就会报内存出错,应该是vc返回的句柄使用出了问题,一直没办法接解决。还请有经验的高手指导。

解决方案 »

  1.   

    HANDLE 不要声明为 pointer,delphi也有THandle
      

  2.   

    MFC DLL.声明中不加__stdcall,采用VC默认格式__cdecl
    在delphi中声明dll时,换成Cdecl声明试试
      

  3.   

    应该是调用约定的问题
    很纳闷很多人看见DLL,就用stcall
      

  4.   

    VC默认cdecl,看原生中没有特意指明stdcall,修改约定试试
      

  5.   

    修改約定試試
    type
      TOpenHIDDev=function():Pointer;Cdecl;
      TCloseHIDDev=function(handle:Pointer):Boolean;Cdecl;
      TWriteHIDDev=function(handle:Pointer;uid:WORD; pipeData,codeWith,rptCnt,DelayTime:Byte):Boolean;Cdecl;