动态库代码如下:
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.
请问,我到底错在哪里?问题解决后马上给分!
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.
请问,我到底错在哪里?问题解决后马上给分!
Result:=FormDll.showmodal;
我看错了。
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;