library Project5;    //编写 dll项目;uses
  SysUtils,ShareMem,
  Classes,WinTypes,WinProcs,
  Unit1 in 'Unit1.pas';   function  Fun2():integer;export;
   begin
         Fun2:=11;
   end;
   exports
     Fun1,
     Fun2 index 2 name 'MyFun2' resident;
//{$R *.res}
var
  SaveExit:Pointer;
  procedure LibExit;far;
  begin    ExitProc:=SaveExit;
  end;
begin
   
end.
              
unit Unit1;   //     编写dll单员interface
    uses
  SysUtils,
  Classes,ShareMem;  function Fun1(var i:integer):integer;export;
  {$R *.dfm}
implementation
  function Fun1(var i:integer):integer;
  begin
         Fun1:=i;
  end;  end.
//*********************************// unit Unit2;           //调用dll单元interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, AMHRollUp, StdCtrls, Buttons;type
   TotalRecord=Record
       Name: array[1..24] of string;
       XinJiao:array[1..24] of integer;
       FangXiang:array[1..24]of integer;
    end;
 TFunction=function():integer;
  TForm1 = class(TForm)
    RollUp1: TRollUp;
    BitBtn1: TBitBtn;
    SpeedButton1: TSpeedButton;
    procedure BitBtn1Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  PFunc:TFarProc;
  Moudle:THandle;
  Record1:TotalRecord;
implementation{$R *.dfm}
      
//function Fun2():integer;far;external 'E:\wer\Dll\Project5.dll';//静态调用动态裂解库函数
procedure TForm1.BitBtn1Click(Sender: TObject);
 VAR i:integer;
begin
                i:=1;
        Moudle:=Loadlibrary('e:\wer\dll\Project5.dll');
        if Moudle>32 then
         begin
          Pfunc:=GetProcAddress(Moudle,'MyFun2');
          i:=TFunction(Pfunc)();
          showmessage(inttostr(i));
          FreeLibrary(Moudle);
          end;
    
end;end.
问题:当我开始动态调用并执行fun2(别名:MyFun2)函数后,程序正常,当我的代码一旦运行到 freelibrary(moudle)
或则退出本应用程序时, 就出现一个error对话框,提示为: Runtime error 204 at 011f2700
这个问题怎么解决阿----------------------高手们帮忙阿,小弟先谢谢了

解决方案 »

  1.   


    问题:当我开始动态调用并执行fun2(别名:MyFun2)函数后,程序正常,当我的代码一旦运行到 freelibrary(moudle)
    或则退出本应用程序时, 就出现一个error对话框,提示为: Runtime error 204 at 011f2700
    这个问题怎么解决阿----------------------高手们帮忙阿,小弟先谢谢了
      

  2.   

    i:=1;
            Moudle:=Loadlibrary('e:\wer\dll\Project5.dll');//-----既然已经静态调用,这名去了吧!
         i:=Fun1;//------这样试试,然后去判断I值
      

  3.   

    你使用了ShareMem单元
    那么在调用dll时必须把ShareMem放在其他单元的前面uses
      

  4.   

    楼上说的有理,还有函数参数的调用顺序在声明和调用时应完全相同,建建议都用
    stdcall;
      

  5.   

    还有别人的铁子:出现错误提示"Invalid Pointer Operation"
    我估计是内存管理方面的问题,不知道哪里出现点问题?网友建议:
    通过参数(如:App)将主程序的Applicantion对象传递到DLL的函数中,
    然后再DLL中设置Application:=App
     我的dll调用时,当程序推出时,也同样有相同的错误提示:,上面网友的改错方法,我觉得可行,。不过具体怎样操作阿
      

  6.   

    DLL 应用程序退出时
    出现错误提示"Invalid Pointer Operation"
    如何解决????
      

  7.   

    如果DLL中的导出函数或过程以字符串或动态数组作为参数或返回值,那么ShareMem必须是DLL和项目的uses子句中的第一单元。这应用于应用程序和DLL的一切字符串的传递,甚至隐含在记录和类中的字符串。ShareMem是共享的内存管理器Borlandmm.dll的接口单元,Borlandmm.dll必须与DLL一起发布。要避免使用Borlandmm.dll,就得用PChar或者ShortString来传递字符串信息