给我一个例子吧,成了,马上给分!!!

解决方案 »

  1.   

    // 调用dll
    procedure TForm1.Button3Click(Sender: TObject);
    var
      handle:Thandle;
      show_sj: procedure;
    begin
      handle:=loadlibrary('sj.dll');
      if handle<>0 then
        begin
          @show_sj := GetProcAddress(handle, 'show_sj');
          if @show_sj <> nil then
            show_sj;
          freelibrary(handle);
        end;
    end;
      

  2.   

    如何调用DLL
      在Delphi中有两种方法调用DLL中的函数和过程,即外部声明或者动态加载。<1>外部声明
      在Delphi中外部声明是访问外部例程最容易和最常用的方式,有两种声明方式:通过名字、通过索引号。举例如下:在MYDLL.DLL中有两个函数和一个过程,则其外部声明可以写成:function test1:integer;external 'mydll';
    //直接通过名称调用test1(注意名称大小写敏感)。 
    function test11:integer;external 'mydll' name 'test1';
    //通过名称调用test1,在程序中使用新名称(原名称仍然大小写敏感)。 
    procedure test2;external 'mydll' index 1;
    //通过索引号调用TEST2。程序中可以用与DLL中不一样的名称. 
      使用外部声明的缺点是程序启动时如果找不到mydll.dll将无法运行,即使没有调用其中的模块。 动态加载的方法可以避免这种情况。<2>动态加载
      通过调用Windows API中的相关函数,将DLL调入内存并获得指向函数或过程的指针,执行完模块后释放内存。除了节约内存外,这种方法的一个很大的优点是能处理找不到dll或者在装入过程中出错的情况。这样即使某个dll有问题,应用程序的其他部分仍然能够正常运行。动态加载的例子如下:var hDll:THandle;
      Test1:function:integer;
    begin
      hDll:=LoadLibrary('mydll.dll');
      if hDll<32 then exit;//如果Dll无法加载则跳出
      @Test1:=GetProcAddress(hDll,MakeIntResource(1));
        //取得mydll中的第一个函数的地址。
      ...
      FreeLibrary(hDll);
    end;
      

  3.   

    有两种方法
    1.静态调用:
    procedure DoSomething; external 'MYLIB.DLL';
    function SomeFunction(S: string): string; external 'strlib.dll';
    2.动态调用;
    先声明一个过程指针变量
    TGetTime = procedure(var Time: TTimeRec);
    在程序中
    var
     Handle: THandle;
     GetTime: TGetTime;
    begin
     Handle := LoadLibrary('libraryname.dll');
     if Handle <> 0 then
     begin
       @GetTime := GetProcAddress(Handle, 'GetTime');//gettime 是动态连接库中的函数
       if @GetTime <> nil then
       begin
         GetTime();
       end;
       FreeLibrary(Handle);
     end;
    end;  
      

  4.   

    谢谢大家!但我在调试的时候出现了“accsee violation at 00X000000",cpu 地址错误。不知道为什么?我把我调试的代码给大家看看procedure TForm1.Button2Click(Sender: TObject);
    var
     Handle: THandle;
     GetTime: procedure;
    begin
     Handle := LoadLibrary('mispj20.dll');
     //showmessage(inttostr(Handle));
     if Handle <> 0 then
     begin
       @GetTime := GetProcAddress(Handle, 'GetTime');//  'GetTime'是什么意思?
       if @GetTime <> nil then
       begin
         GetTime();
       end;
       FreeLibrary(Handle);
     end;
    end;
    我的一个dll ,对应多个函数名,怎样一个个取到呢?各位高手麻烦再帮我看看!!
      

  5.   

    @GetTime := GetProcAddress(Handle, 'GetTime');//  'GetTime'是什么意思?
    我的一个dll ,对应多个函数名,怎样一个个取到呢?
    这个就是Dll导出的函数名,呵呵
      

  6.   

    内存泄露Memory Leak肯定是有指针或对象没有Free,资源不足多半因为有BMP对象没free自己创建的dll必须自己释放掉。
    可以在创建时把dll加入到一个TList中去。需要释放的时候,只需要检查
    TList中是否有元素,有则逐个释放之。注意TList.Free的时候,不会自动
    释放掉List中的对象的。
      

  7.   

    @GetTime := GetProcAddress(Handle, '我的函数');这句话执行后,就会出现 “accsee violation at 00X000000",cpu 地址错误。请问 GetProcAddress是什么函数,请高手帮我解决。谢谢!!
      

  8.   

    你再USES中引用 StdCtrls了吗?
    给你一个例子:
    unit ttt;interfaceuses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls;type
     TFuncOne = Function (I : Integer) : Integer; [red]stdcall;[/red] //注意这个
     
     TForm1 = class(TForm)
       Button1: TButton;
       procedure Button1Click(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
     end;var
     Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
     pf : TFuncOne ;
     mh : THandle;
    begin
     mh := LoadLibrary(PChar('TTTD.dll')) ;
     if mh <> 0  then
       begin
       @Pf := GetProcAddress(mh,'One') ;
       ShowMessage(IntToStr(pf(0))) ;
       FreeLibrary(mh);
       end;
    end;end.
    要不行的话,把代码贴出来,帮你看看