往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

解决方案 »

  1.   

    if MainForm.MDIChildren[i].Name=MDIForm.Name then
          Result:=True               //找到同名的表单返回真,否则退回假
       else
          Result:=False;
    ____________________
    改成 i<mainform.mdichildcount then
         result:=true
         else
          result:=false;
      

  2.   

    问题依旧,如果将所有的.Name改成.Caption程序不报错,但运行结果却不对,是不是在DLL中不能够使用从主程序中传来的MainForm,MDIForm对象?
      

  3.   

    你写错了。以为当你在第一次建立窗体时,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;
      

  4.   

    上帖你的方法有问题,建议你采用如下方法:
    在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;