问题内容如题
请高手赐教

解决方案 »

  1.   

    我也遇到过看下面的代码可以解决:
    下面是源码:
        Project1.DPR {主叫程序}
        Unit1.PAS {主叫程序单元}
        Project2.DPR {DLL}
        Unit2.PAS {DLL单元}
    {---------- DLL 主程序 Project2.DPR ----------}library Project2;uses
      SysUtils,
      Classes,
      Unit2 in 'Unit2.pas' {Form1};{$R *.RES}{ 下面的语句用于向调用该 DLL的程序提供调用接口 }
    exports
      DoTest;       { 过程来自单元Unit2 }begin
    end.
    {---------- DLL中的单元 Unit2.PAS ----------}unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Db, ADODB, StdCtrls, Menus;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;{ 本地数据库连接 }
        Memo1: TMemo;                  { 用于显示信息   }
      private
      public
      end;{ 该过程向外提供 }
    procedure DoTest(H: THandle;           { 获得调用者的句柄       }
                     AConn: TADOConnection;{ 获得调用者的数据库连接 }
                     S: string;            { 获得一些文本信息       }
                     N: Integer);          { 获得一些数值信息       }
                     cdecl;                { 指定调用协议           } implementation{$R *.DFM}procedure DoTest(H: THandle; AConn: TADOConnection; S: string; N: Integer);
    begin
      Application.Handle := H;              { 将过程的句柄赋值为调用者的句柄 }
      { 上面语句的作用在于, DLL的句柄和调用者的句柄相同,在任务栏中就不会   }
      { 各自出现一个任务标题了。                                             }
      with TForm1.Create(Application) do try{ 创建窗体                       }
        Memo1.Lines.Append('成功调用');     { 显示一行信息                   }
        ADOConnection1 := AConn;            { 获得数据库连接的实例           }
        Memo1.Lines.Append(
          ADOConnection1.ConnectionString +
          ' - ' + S + ' - ' + IntToStr(N)); { 根据得到的参数显示另一行信息   }
        ShowModal;                          { 模式化显示窗体                 }
      finally
        Free;                               { 调用结束时销毁窗口             }
      end;
    end;end.
    {---------- 调用者 Project1.DPR,很普通的工程文件 ----------}program Project1;uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1};{$R *.RES}begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    {---------- 调用者单元Unit1.PAS ----------}unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Db, ADODB;type
      TForm1 = class(TForm)
        Button1: TButton;   { 按此按钮进行调用 }
        ADOConnection1: TADOConnection;         { 本地数据库连接,将传递给 DLL }
        procedure Button1Click(Sender: TObject);{ 调用 DLL}
      private
      public
      end;var
      Form1: TForm1;implementation{$R *.DFM}{ 外部声明必须和 DLL中的参数列表一致,否则会运行时错误    }
    procedure DoTest(H: THandle;             { 传递句柄       }
                     AConn: TADOConnection;  { 传递数据库连接 }
                     S: string;              { 传递文本信息   }
                     N: Integer);            { 传递数值信息   }
                     cdecl;                  { 指定调用协议   }
                     external 'Project2.dll';{ 指定过程来源   }{ 调用过程 }
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      DoTest(Application.Handle,
             ADOConnection1,
             'Call OK',
             256);
    end;end. 
      

  2.   

    1.将上面的TADOConnection换成WebBrowser 即可解决.
    2.别忘了在工程单元的uses中首位上加sharemem;
      

  3.   

    用我的方法吧,记得给分喔!
    假如A.EXE调用你的B.DLL,那么在A.EXE的FormCreate事件中加入:CoInitialize(nil);
    在FormDestory事件中加入:CoUninitialize;
    或者你直接在B.DLL中加上:
    Begin
    CoInitialize(nil);
    end.记得要uses ActiveX喔!如果还不行,你发帖,我再告诉你新方法,如果可以,先把分加了再说谢谢!
      

  4.   

    楼上的方法就是了原因是在DLL中调用COM,必须先进行初始化CoInitialize的参数一般为nil最后记得 CoUninitialize这两个方法在ActiveX单元中,你可以查看帮助
      

  5.   

    用ADO就这样。用lovehacker()的方法吧。