dll封装子窗体代码如下:
library Project1;
uses
  ShareMem,
  ActiveX,
  Forms,
  Windows,
  Graphics,
  Controls,
  Messages,
  SysUtils,
  Classes,
  Dialogs,
  Unit1 in 'Unit1.pas' {Form1};{$R *.res}
    var
      DllApp:TApplication;procedure CreateForm1(app:TApplication;parentform: TForm); export;stdcall;
 var
  Form1: TForm1;
  DllProc: Pointer;
begin
  CoInitialize(nil);
   try
     Application:=app;     Form1:=Tform1.Create(parentform);
     form1.MyParentForm:= parentform;
     form1.myparentApplication:=app;
     Form1.Show;
     finally
       CoUninitialize;
    end;
end;
procedure ExitDll(Reason:Integer);
begin
  if Reason = DLL_PROCESS_DETACH then
  begin
    Application:=DllApp;    end;
end;exports
 CreateForm1;begin
  DllApp:=Application;  DllProc:=@ExitDll;
end.其中Unit1代码:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls;type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    ADOConnection1: TADOConnection;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    ADOQuery1: TADOQuery;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    MyParentForm: TForm;
    MyParentApplication: TApplication;
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('select * from c_user where name like ''%'+edit1.Text+'%''');
    ADOQuery1.Open;
end;end.
主窗体代码:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ToolWin, ComCtrls, Menus;type
  TForm1 = class(TForm)
    Button1: TButton;    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  T_CreateForm1 = procedure (app: TApplication;parentform: TForm);stdcall;
var
  Form1: TForm1;implementation
uses
  ShareMem;
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
  dllHandle: THandle;
  Procaddr: FarProc;
  CreateForm1: T_CreateForm1;begin
    dllHandle:=LoadLibrary('project1');
    Procaddr:=GetProcAddress(dllHandle,'CreateForm1');
    if Procaddr <> nil then
    begin
      CreateForm1:=procaddr;
      CreateForm1(Application,self);
    end;
end;end.

解决方案 »

  1.   

    v建议你引用FastShareMem,引用ShareMem不行,还是会有内存地址错误。听说Delphi2007版本以上的做这样的比较方便。
      

  2.   

    FastShareMem,会报错
    [Fatal Error] Project1.dpr(25): File not found: 'FastShareMem.dcu'
      

  3.   

    下一个 fastMMhttp://topic.csdn.net/u/20081030/13/6d85c529-c59b-4b84-a415-19634fc4761e.html
    应该在调用DLL的工程文件中第一个引用 ShareMem在DLL退出的时候应该恢复DLL的APPLICATION