DLL中的代码,用来打开一个对话框,如果存在了,就不用创建了。
procedure ExecPrint(aFileList: TStringList); overload;
var
  hd: Hwnd;
begin
  hd := FindWindow('TfmDwgPrn', '文件打印提交');
  if hd <> 0 then
    begin
      SetForegroundWindow(hd);
///////////我如何才能执行fmDwgPrn.AddFiles(aFileList);????
      Exit;
    end;
  CoInitialize(nil);
  fmDwgPrn := TfmDwgPrn.Create(nil);
  try
    fmDwgPrn.AddFiles(aFileList); //////////就是这句!!
    fmDwgPrn.ShowModal;
  finally
    fmDwgPrn.Free;
    CoUninitialize;
  end;
end;
各位如果有更好的办法,请指教。
PS:我试过MultInst,但是不行,由于调用它的进程不释放,它即使关了,下次也打不开了。

解决方案 »

  1.   

    fmDwgPrn := TfmDwgPrn.Create(nil);
    换成 fmDwgPrn := TfmDwgPrn.Create(self);
    不妨一试
      

  2.   

    在Dll中引用窗体后使用行不行?
      

  3.   

    将你的AddFiles函数声明在fmDwgPrn的Public区试试,另外记得在Dll中引用窗体单元!
    一个单元是不能访问另一个单元的私有成员区的函数及变量的!
      

  4.   

    postmessage;在消息处理中调用ADDFioles
      

  5.   

    大家别误会,我的意思是下面一句要在上面实现,不知如何处理。to linx88
      消息能传递stringlist吗?怎么写?
      

  6.   

    procedure ExecPrint(aFileList: TStringList); overload;
    var
      hd: Hwnd;
      fmDwgPrn: TfmDwgPrn
    begin
      try
      hd := FindWindow('TfmDwgPrn', '文件打印提交');
      if hd <> 0 then
        begin
          SetForegroundWindow(hd);
          CoInitialize(nil);
          fmDwgPrn := TfmDwgPrn.Create(nil);
          fmDwgPrn.AddFiles(aFileList); //////////就是这句!!
          fmDwgPrn.ShowModal;
          Exit;
        end;
      finally
        fmDwgPrn.Free;
        CoUninitialize;
      end;
    end;