动态库代码如下:
library MyForms;uses
  SysUtils,Classes,Forms,
  DLLForm in 'DLLForm.pas' {FormDLL};function ShowForm:Integer;stdcall;
  var
    FormDll:TFormDLL; 
  begin
    FormDll:=TFormDll.Create(Application);
    Result:=FormDll.showmodal;
    FormDll.Free;
  end;
  exports
      ShowForm;
{$R *.res}begin
end.
动态库中的窗体上主要有ADOConnection1,ADOQuery1,DataSource1,DBGrid1,BitBtn1,BitBtn2等控件;窗体代码如下:
unit DLLForm;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Buttons, DB, ADODB, Grids, DBGrids, ActiveX,
  DBClient, MConnect, SConnect, DBTables;type
  TFormDLL = class(TForm)
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    BitBtn2: TBitBtn;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  FormDLL: TFormDLL;
implementation
{$R *.dfm}
procedure TFormDLL.BitBtn1Click(Sender: TObject);
begin
  Close;
end;procedure TFormDLL.BitBtn2Click(Sender: TObject);
begin
  FormDLL.ADOQuery1.SQL.Clear;
  FormDLL.ADOQuery1.SQL.Add('select * from test');
  FormDLL.ADOQuery1.Open;
end;
initialization
  CoInitialize(nil);
finalization
  CoUnInitialize;
end.
我在一应用程序中调用该DLL,应用程序代码如下:
unit UseDLL;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ADODB,ActiveX, DB;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  function ShowForm:Integer;stdcall;
  external'myforms.dll';
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowForm;//调用动态库myforms.dll中的函数
end;end.
现在的问题是,当我运行应用程序,按下应用程序中的按钮Button1显示DLL中的窗体,我再按下DLL窗体中的按钮BitBtn2,就出现以下错误代码:
Access violation at address 002f1B81 in module 'myforms.dll',read of address 00000324.
请问,我到底错在哪里?问题解决后马上给分!

解决方案 »

  1.   

    你都没给你的ADOConnection1写连接数据库的代码呢(或许你是设计时写的静态的吧)。建议(不是你的错误):还有你这个DLL与你的主窗体没有交互功能,即不能互相传递参数,我现在不能测试你的代码,倒是写过这种DLL,现在网吧也不好分析。function ShowForm:Integer;stdcall;你申明返回整数,但你实现代码中没有返回值呀。还不如写成procedure.
      

  2.   

    哈,看到你返回了
    Result:=FormDll.showmodal;
    我看错了。
      

  3.   

    建议:
    1、正确设置ADOConnection1的连接代码;
    2、procedure TFormDLL.BitBtn2Click(Sender: TObject);
    begin
      FormDLL.ADOQuery1.Active:=False;  //或者在设计时就要保证这点  FormDLL.ADOQuery1.SQL.Clear;
      FormDLL.ADOQuery1.SQL.Add('select * from test');
      FormDLL.ADOQuery1.Open;
    end;
      

  4.   

    谢谢,问题解决了!是FormDLL.ADOQuery1.Active:=False;  的问题,设计时我把它设成True了!