问题,为何同样的代码,在d6下不会报错,在d7下却会报错(运行下报错).os 环境是一样的。代码如下(关于动态调用DLL 中的窗体的代码):
-----调用代码-------
unit uMainFrm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB;type
InvokeDLLForm = function(App: TApplication; Scr: TScreen): TForm;
TfrmMain = class(TForm)
Button1: TButton;
ADOCon1: TADOConnection;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
frmMain: TfrmMain;
DLLForm: TForm;
implementation{$R *.dfm}procedure TfrmMain.Button1Click(Sender: TObject);
var
DLLHandle: THandle;
DLLSub: InvokeDLLForm;
begin
DLLHandle := LoadLibrary('BOMI01C.dll');
if DLLHandle <> 0 then
begin
@DLLSub := GetProcAddress(DLLHandle, 'CreateForm');
if Assigned(DLLSub) then
begin
DLLForm := DLLSub(Application, Screen);
end;
end;
end;
end.-----DLL 代码-----------------uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,adodb;type
TfrmBOM = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end; procedure CreateForm(MainForm: TForm);var
frmBOM: TfrmBOM;implementation{$R *.dfm}procedure CreateForm(MainForm: TForm);
var
p: ^LongInt;
DllForm: TfrmBom;
begin
p := @(Application.MainForm);
P^ := LongInt(MainForm);
DllForm := TfrmBom.Create(MainForm);
DllForm.Show;
end;procedure TfrmBOM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := cafree;
end;end.library BOMI01C;uses
SysUtils,
forms,
windows,
Classes,
uBOMI01 in 'uBOMI01.pas' {frmBOM};
{$R *.res}
exports
CreateForm;begin
end.
-----调用代码-------
unit uMainFrm;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB;type
InvokeDLLForm = function(App: TApplication; Scr: TScreen): TForm;
TfrmMain = class(TForm)
Button1: TButton;
ADOCon1: TADOConnection;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
frmMain: TfrmMain;
DLLForm: TForm;
implementation{$R *.dfm}procedure TfrmMain.Button1Click(Sender: TObject);
var
DLLHandle: THandle;
DLLSub: InvokeDLLForm;
begin
DLLHandle := LoadLibrary('BOMI01C.dll');
if DLLHandle <> 0 then
begin
@DLLSub := GetProcAddress(DLLHandle, 'CreateForm');
if Assigned(DLLSub) then
begin
DLLForm := DLLSub(Application, Screen);
end;
end;
end;
end.-----DLL 代码-----------------uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,adodb;type
TfrmBOM = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end; procedure CreateForm(MainForm: TForm);var
frmBOM: TfrmBOM;implementation{$R *.dfm}procedure CreateForm(MainForm: TForm);
var
p: ^LongInt;
DllForm: TfrmBom;
begin
p := @(Application.MainForm);
P^ := LongInt(MainForm);
DllForm := TfrmBom.Create(MainForm);
DllForm.Show;
end;procedure TfrmBOM.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := cafree;
end;end.library BOMI01C;uses
SysUtils,
forms,
windows,
Classes,
uBOMI01 in 'uBOMI01.pas' {frmBOM};
{$R *.res}
exports
CreateForm;begin
end.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货