求一个 简单的DLL封装的 窗口  操作其它窗口的实例!试过很多方法,可以正确显示出DLL中封装的窗口,显示出的窗口也能够正确操作自身,但是一操作其它的窗口就会出错,
求一份可以正确操作其它窗口的DemoDLL代码如下:library mydll;uses
  SysUtils,
  Classes,
  dunit in 'dunit.pas' {dForm};{$R *.res}
Procedure CallDll();stdcall;
begin
  dForm := TdForm.Create(nil);
  try
  dForm.Show;
  except
  dForm.Free;
  end;
end;
 exports
   CallDll;
begin
end.
dunit.pas代码如下   封装进DLL中的窗体unit dunit;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, MainForm1;type
  TdForm = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  dForm: TdForm;implementation{$R *.dfm}procedure TdForm.Button2Click(Sender: TObject);
begin
close;
end;procedure TdForm.Button1Click(Sender: TObject);
begin
Form1.Button1.Caption := '标题已被DLL窗体改变'; //改变其它窗体上的按钮
end;procedure TdForm.Button3Click(Sender: TObject);
begin
self.Button1.Caption := '改变自身窗体按钮一';
end;end.
测试DLL窗体的程序,代码如下:unit MainForm1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation
Procedure CallDll();stdcall;
 external 'mydll.dll'; {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
CallDll();
end;end.
   有实例的希望发一个给看一下,,,或者帮忙看一下我代码中是否有少写或写错的地方,以
致DLL窗口在操作其它窗口的时候了错

解决方案 »

  1.   

    你需要传递主程序的application.handle给dll,然后在dll关闭时,恢复dll的application.handle,前几个月的帖子中有,或者搜索 dll窗体融合
      

  2.   

    搜索的那些看了都不对,DLL中的窗体,如果操作主窗体的话,一样会出错
      

  3.   

    谁能帮忙发一个DEMO看一下吗,谢谢了,只能要DLL中的窗体能够正常操作主窗体(或其中的任何控件)都可以,
    [email protected]
      

  4.   

    dll中的窗体干嘛要操作主窗体,如果这么做,dll里的窗体还要引用主窗体的单元文件。封装的意义何在~
    简单点给主窗体发消息吧,复杂点就用接口吧~
      

  5.   

    我是用VC写EXE(很小),delphi写DLL(GUI)再加密,由EXE手动加载DLL界面
      

  6.   

    楼上的说过。传递要操作窗口的句柄到dll,Form1用句柄代替。
      

  7.   

    在dll中再封装一个获取Application.Handle的函数,例如:procedure SynAPP(App:THandle);stdcall;
    begin
      Application.Handle:=App;
    end;
    dForm := TdForm.Create(nil);
    改为dForm := TdForm.Create(Application);测试调用加上这句  procedure SynAPP(App:THandle);stdcall;external 'mydll.dll';procedure TForm1.Button1Click(Sender: TObject);
    begin
      SynApp(Application.Handle);
      CallDll();
    end;
    试一下吧,应该可以了
      

  8.   

    试了8楼提供的方法,还是不可以。有朋友说如果用DLL的窗口来操作主窗口就会失去封装的意义,其实我自己是这样想的,我是想把一些控件和常用
    的函数、过程封装进DLL,这样在运行的时候此控件在内存中就只有一个实例。   例如我想封装ADODATASET    ADOCONNECTION  ADOQUERY   等,