往DLL动态库函数传送对象时出错

siaosa 2003-02-28 04:17:15
往DLL动态库函数传送对象时出错
在一个DLL项目中申明以下函数,这样对吗?
function fBool_ExistMDIForm(MainForm,MDIForm:TForm):Boolean;stdcall;
//MainForm为MDI主表单,MDIForm为MDI子表单
var
i:Integer;
begin
i:=0;
while i<MainForm.MDIChildCount do
begin
begin
if MainForm.MDIChildren[i].Name=MDIForm.Name then
break //如果找着同名的子表单则程序退出循环
else
i:=i+1;
end;
end;

if MainForm.MDIChildren[i].Name=MDIForm.Name then
Result:=True //找到同名的表单返回真,否则退回假
else
Result:=False;
end;

调用方式在MDI子表单的OnActivate代码中调用,Form1是MDI主表单名
if fBool_ExistMDIForm(Form1,self) then
begin
showmessage('已经运行了一个实例');
end;

程序在运行时报错 Access violation at address 00281f0e in modul 'XXXXXX.DLL'. Read of address 00000008
...全文
46 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ctk 2003-03-03
  • 打赏
  • 举报
回复
上帖你的方法有问题,建议你采用如下方法:
在interface处声明一个变量:
interface
var
midform : tmdiform;
oldapp : tapplication;

function fBool_ExistMDIForm(app:Tapplication;MDIFormclassname : pchar):Boolean;stdcall;
... //初始化部份,判断窗体是否存在
if not assigned(oldapp) then
begin
oldapp := application;
application := app;
end;
...
mdiform := tmidform.create(app.mainform); //修改createform的语句
...
end;

ctk 2003-03-03
  • 打赏
  • 举报
回复
你写错了。以为当你在第一次建立窗体时,MDIFORM = NIL,这时调用MDIFORM.NAME当然会报错,正确的方法是:
function fBool_ExistMDIForm(MainForm,MDIFormclassname : pchar):Boolean;stdcall;
var
i : integer;
begin
result := false;
for i := 0 to mainform.childcount - 1 do
//classname 代表类名
if mdichildren[i].classname = mdiformclassname then
begin
mdichildren[i].bringtofront;
result := true;
break;
end;
if not result then
begin
.... //创建窗体的语句
result := true;
end;
end;
siaosa 2003-03-01
  • 打赏
  • 举报
回复
问题依旧,如果将所有的.Name改成.Caption程序不报错,但运行结果却不对,是不是在DLL中不能够使用从主程序中传来的MainForm,MDIForm对象?
zjybestzjybest 2003-02-28
  • 打赏
  • 举报
回复
if MainForm.MDIChildren[i].Name=MDIForm.Name then
Result:=True //找到同名的表单返回真,否则退回假
else
Result:=False;
____________________
改成 i<mainform.mdichildcount then
result:=true
else
result:=false;

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧