library fronts;uses
  sharemem,
  MidasLib,
  SysUtils,
  Classes,
  mid_ba in '..\mid_ba.pas',
  fronts_ba in '..\fronts_ba.pas',
  dllmain in 'dllmain.pas',
  ........................;{$R *.res}
exports
create_fronts,destroy_fronts;begin
end.如上面在DLL中引用了很多单元在这里就不一一列举,最后输出函数create_fronts,destroy_fronts;上面的两个函数放在dllmain里面。在单元fronts_ba中为定义类为TFront_ba = class(TObject)其中有DLL的大部分函数。函数create_fronts的格式如下:(引用了其他单元)uses mid_ba,fronts_ba.........function create_fronts(dbs: tdatabase): Tfront_ba;//(返回值为类Tfront_ba)
begin
.....(下面主要是连接数据库,一个为局域网数据库,一个为外网数据库)
  try
    yy:= Tyy.Create(nil);
    db1:=yy.db1Server;
    db1.Connected := true;
  except
    yy.Free;
    ba:=tfront_ba.create;
    result:=ba;
    exit;
  end;
  db2:=yy.db2Server;
  try
     ba:=Tfront_bc.Create;
     if not ba.Enabled then
     begin
       ba.Free;
       ba:=tfront_ba.Create;
     end;   except
       ba:=tfront_ba.Create;
   end;
   result:=ba;
.....end;//--------------------------------------------------------------------------------------------------
以上为DLL的内容。不知小弟表达清楚没有?在调用的时候出现错误我也是百思不得其解呀!!
首先在tfront_ba中有大部分函数(在单元里面)如果我在程序中调用这个DLL并且调用函数
create_fronts就会返加一个Tfront_ba类是不是?格式如下:
type
  TStrFunction=function (dbs:Tdatabase):Tfront_ba;stdcall;procedure TForm1.Button1Click(Sender: TObject);
var
  Hinst:Thandle;
  MyFunct:TStrFunction;
begin
   Hinst:=LoadLibrary('fronts.dll');
   if Hinst>0 then
      try
         @MyFunct:=GetProcAddress(HInst,'create_fronts');
         if @MyFunct<>Nil then
            begin
               MyFunct(db);
            end
           else
              showmessage('DLL Function not found.');
      Finally
         FreeLibrary(Hinst);
      end
      else
         ShowMessage(' Library not Found');
end;
请各位指点上面的调用有没有错?如果没有那么在运行的时候就报错为什么?点击Button1之后能够执
行函数(连接正常),但马上提示一个错误点确定后就退出窗体?还有另外一个重要的问题就是在调用DLL中create_fronts函数之后返回Tfront_ba类如果我这样
t:Tfront_ba 就可以使用全部函数了t.abc(...)?但是好像也不行不知为什么?其中函数的调用方法好像与一般的DLL有点不同?请高手帮小弟解决解决....

解决方案 »

  1.   

    也是可以调试的,自己断点进去看看啊.在run-parameters里添加一个调用到你的dll函数的宿主程序,然后在dll里设置断点,运行程序调用dll函数,就可以到断点里了.还有看看你是不是用stdcall
      

  2.   

    感谢楼上这位兄弟用了stdcall 总的说来调用还是没有多大的问题?
      

  3.   

    第一个问题,怀疑是动态调用,然后就理解释放dll的问题,修改成静态调用看看。
    或者暂时FreeLibrary(Hinst);把这个注销掉。如果还不可以,就按照fenger8293的方法,调试dll
      

  4.   

    第二个,要使用dll的返回值,要在FreeLibrary(Hinst);之前。
      

  5.   

    Dlwxn(Dlwxn)FreeLibrary(Hinst);把这个注销掉我试过的运行之后连通之后就退出窗体了.
    静态调用试一试看行不行.但是DLL我觉得没多大问题他们用都正常啊.我看只是调用了
      

  6.   

    各位兄弟朋友们现在问题又有新的进展.如果静态和动态同时定义只调用动态的就可以用了一切.真他妈见鬼.但是返回类之后比如:t:Tfron_ba.我调用其中的函数格式t.abc(12) 调用后没有反映不知是什么原因? 其函数格式为:
    function abc(d:integer):boolean;