错误提示: “Project c:\……\Project1.exe raised too many consecutive exceptions 'access violation at 0x06f836a2 : read of address 0x07044638' process stopped. uses step or run to continue. 别的DLL里没有 ,现在就这一个DLL了!!
xxmmmx(踢踏):哥们儿你QQ多少,偶加你一下,把程序发给你你看看好吗??
偶又发现了点:因为偶DLL的窗体是MDICHILD,所以主程序在传递参数的时候把SCREEN也传递过去了,在DLL里面有这样的代码: var DllApp: TApplication; // DllScr: TScreen; {$R *.res}procedure MyDllHandle(iReaSon: Integer); begin if iReaSon = 0 then begin Application := DllApp; // Screen := DllScr; end; if iReaSon = 1 then begin DllApp := Application; // DllScr := Screen; end; end;exports ShowForm;begin DllProc := @MyDllHandle; end.在出口函数里: procedure ShowForm(Scr: TScreen;App: TApplication;ADOC: TADOConnection); begin // Screen := Scr; Application := App; with TForm1.Create(nil) do begin try Showmodal; finally Free; end; end; end;现在如果我照上面的“//”,把传递的SCREEN都屏蔽了,程序就可以运行, 如果把//放开,在DLL窗体关闭的时候就会出问题!!
严格说一个都没用,因为偶把组件删除了,还是有问题,除非把USES里面的那几个单元
也去掉才可以……
楼上的可不可以帮帮偶,偶QQ:113602031
谢谢……
DLL的窗体里别的啥都没有,就一个DBCHART,还是出问题~~郁闷死了~~~~ :(
“Project c:\……\Project1.exe raised too many consecutive exceptions
'access violation at 0x06f836a2 : read of address 0x07044638' process stopped.
uses step or run to continue.
别的DLL里没有 ,现在就这一个DLL了!!
var
DllApp: TApplication;
// DllScr: TScreen;
{$R *.res}procedure MyDllHandle(iReaSon: Integer);
begin
if iReaSon = 0 then
begin
Application := DllApp;
// Screen := DllScr;
end;
if iReaSon = 1 then
begin
DllApp := Application;
// DllScr := Screen;
end;
end;exports ShowForm;begin
DllProc := @MyDllHandle;
end.在出口函数里:
procedure ShowForm(Scr: TScreen;App: TApplication;ADOC: TADOConnection);
begin
// Screen := Scr;
Application := App;
with TForm1.Create(nil) do
begin
try
Showmodal;
finally
Free;
end;
end;
end;现在如果我照上面的“//”,把传递的SCREEN都屏蔽了,程序就可以运行,
如果把//放开,在DLL窗体关闭的时候就会出问题!!
这儿有例子,你下载参考一下。
http://www.2ccc.com/article.asp?articleid=563
1.偶不理解
MyParentForm: TForm;
MyParentApplication: TApplication; 这两个变量在例子中起的什么作用?
2.在调用MDI窗体时只传递了APPLICATION,而没有传递SCREEN,
这样主窗体的MDIChildCount估计不会改变!你又怎么处理这个问题呢?谢谢!!!
偶书看的少,所以不知道起什么作用,只知道Application和Screen是必须传进去的(这个例子可能简单点)。那个MainForm我都是传进去的。
每个Dll我至少传4个参数:
wHandle : Integer; //主程序的Handle
pForm : TForm; //主程序的MainForm
MainApp : TApplication; //主程序的Application
MainScreen : TScreen; //主程序的Screen
Create后的参数,偶看刘艺的书说如果用nil可以少占用些资源,不过创建后要自己负责销毁!
所以这个偶认为应该关系不大。
不过上午偶也试了把MainForm传进去,问题依旧~~谢谢你的参与!!
另外,EHLIB的打印控件,预览时在上述情况下也会出现问题!
提示是不能复制一个TFONT,不知道有人注意过没有!
Dll里创建窗体有用的是这两个参数
MainApp : TApplication; //主程序的Application
MainScreen : TScreen; //主程序的Screen另外两个参数是有另外特殊的用途,也许你用不到,可以不管他。供参考:
var
Child: TFQueryInvoice;
begin
Child:=nil;
Application := MainApp;
DLLScr := MainScreen;
try
Application.CreateForm(TFQueryInvoice,Child);
Child.Show();
except
Child.Free();
end;
end;var
Child: TFMainChart;
begin
Application := MainApp;
DLLScr := MainScreen;
Application.CreateForm(TFMainChart,Child);
try
Child.ShowModal;
finally
Child.Free;
end;
end;
原因是dll和主控程序都有一个application和screen对象,在dll装入进程后,要用主控程序的application和screen对象替换dll中的相应对象,这即使这样,也只能解决部分问题,还有许多无法克服的困难.
建议用bpl代替dll,bpl是面向对象的,整个bpl体系只有一个全局的application和screen,所有问题都会迎刀而解