我用主程序调用一个带ado窗体的DLL文件,窗体可以正常运行,但主程序在退出时出错:
1、"0x004732d6" 指令引用的 "0x00a25108"内存。该内存不能为"read"。要终止程序,请单击“确定”。
2、runtime error 216 at 004732d6
请问是什么问题?
1、"0x004732d6" 指令引用的 "0x00a25108"内存。该内存不能为"read"。要终止程序,请单击“确定”。
2、runtime error 216 at 004732d6
请问是什么问题?
Form1: TForm1;
//在要调用DLL文件的程序的var下写
procedure synapp(App: THandle); stdcall; external 'usedll.dll'; //----你的DLL文件名
procedure showform; stdcall; external 'usedll.dll'; //----你的DLL文件名implementation
//需加入math单元
uses math;
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
Synapp(application.Handle);
Showform;
end;
--这是调用的代码
begin
Application.Handle := app;
end;procedure showform; stdcall;
begin
Form1 := Tform1.create(application);
Form1.Show;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption := 'DLL测试程序';
ADODataSet1.Open;end;initialization
CoInitialize(nil);
finalization
CoUnInitialize;--这是DLL中FORM的代码
begin
Application.Handle := app;
end;
你将主窗体的句柄赋值给了Application.Handle,原来的Dll句柄要保存下,退出的时候要赋值回去
begin
Synapp(Form1.Handle);
Showform;
end;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
procedure synapp(App: THandle); stdcall; external 'Project1.dll'; //----你的DLL文件名
procedure showform; stdcall; external 'Project1.dll'; //----你的DLL文件名
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
Synapp(Form1.Handle);
Showform;
end;DLL的工程:uses
SysUtils,
Classes,
Windows,
Messages,
Variants,
Graphics,
Controls,
Forms,
Dialogs,
Unit1 in 'Unit1.pas',
Unit2 in 'Unit2.pas' {Form2};{$R *.res}
procedure synapp(App: THandle); stdcall;
begin
Application.Handle := app;
end;procedure showform;stdcall;
begin
Form2 := Tform2.create(application);
Form2.Show;
end;exports
synapp,showform;DLL unit1:
unit Unit1;
interface
uses ActiveX;
implementationinitialization
CoInitialize(nil);
finalization
CoUnInitialize;
你最好调试下看看
你可以在DLL里建立一个对象,输出一个对象,显示窗体以后,然后对象free掉
或者是在DLL里建一个全局变量,把handle保存一下,关的时候,把handle free掉