我在编译下面语句是出现错误:
procedure TForm1.Button2Click(Sender: TObject);
var hh:TFarProc;
    Moudle: THandle;
begin
    moudle:=loadlibrary('mydll.dll');
    hh:=getprocaddress(moudle,'funb');
    hh('xxxx');       //error
    freelibrary(moudle);
end;
错误提示:missing operator or semicolon
可我怎么也查不出来。拜托各位了。我的mydll.dll里这样定义:
procedure funb(m:pchar);export;stdcall;
begin
showmessage(m);
end;

解决方案 »

  1.   

    type Tproc=procedure(m:pchar);stdcall;procedure TForm1.Button2Click(Sender: TObject);
    var hh:TFarProc;
        Moudle: THandle;
    begin
        moudle:=loadlibrary('mydll.dll');
        hh:=getprocaddress(moudle,'funb');
        Tproc(hh)('xxxx');       //error现在export已经不用了,是用在16位上的,你去掉好了
        freelibrary(moudle);
    end;
      

  2.   

    首先你使用的是动态调用的方法。
    FARPROC GetProcAddress(
      HMODULE hModule,    // handle to DLL module
      LPCSTR lpProcName   // function name
    );
    返回DLL中函数的地址。相应的你也要定义一个与该函数变量(类型和DLL中的函数相同)。然后通过赋值得到函数内容。type
    //定义函数类型
      TXXXX = function(XXX: Integer): Integer  <----我假设你DLL中函数的原形是这样的。
    var
    //申明变量
      XXXX: TXXXX;@XXXX = GetProcAddress(hModule, lpProcName); <----得到函数地址
    使用方法:
    var
      I: Integer;
    begin
      I := XXXX(1234);
    end;