我用的是Delphi7,在DLL中生成一无模式窗体,引出创建和关闭窗体的两个函数,代码如下
function CreateMyForm(AHandle:THandle):longint;
var
  DLLForm: TMyForm;
begin
  Application.Handle := AHandle;
  DLLForm := TMyForm.Create(Application);
  Result := Longint(DLLForm);
  DLLForm.Show;  
end;
procedure CloseMyForm(AFormRef: Longint);
begin
  if AFormRef > 0 then
    TMyForm(AFormRef).Release;
end;然后在我的测试程序中使用这两个函数,代码如下:
unit frmMain;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TMainForm = class(TForm)
    btnCreate: TButton;
    btnClose: TButton;
    procedure btnCreateClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
  private
    { Private declarations }
    FFormRef:TForm;
  public
    { Public declarations }
  end;var
  MainForm: TMainForm;function CreateMyForm(AHandle:THandle):Longint;stdcall;
  external 'MyLib.dll';
procedure CloseMyForm(AFormRef: Longint);stdcall;
  external 'MyLib.dll';
  
implementation{$R *.dfm}procedure TMainForm.btnCreateClick(Sender: TObject);
begin
  if not Assigned(FFormRef) then
    FFormRef := TForm(CreateMyForm(Application.Handle));
end;procedure TMainForm.btnCloseClick(Sender: TObject);
begin
  if Assigned(FFormRef) then
  begin
    CloseMyForm(Longint(FFormRef));
    FFormRef := nil;
  end;
end;end.现在问题是:
    当我点击btnCreate按钮创建窗体,再点btnClose关闭窗体时,然后退出程序,一切正常
但当我点btnCreate按钮创建窗体,不关闭窗体直接退出程序时,就会出现错误提示:project DllTest.exe raised too many consecutive exceptions:'access violation at 0x002332d6:read of address 0x00d32850.'
即使我在MainForm.Destroy事件中加上关闭窗体的代码,也会出现同样的错误。
请问这是什么原因??应该怎样解决??谢谢

解决方案 »

  1.   

    var
      DLLForm: TMyForm;procedure CreateMyForm(AOwner:TComponent);
    begin
      if not Assigned(DLLForm) then
          DLLForm := TMyForm.Create(AOwner);
      DLLForm.Show;  
    end;
    调动:
    CreateMyForm(Application);
      

  2.   

    hch_45(HCH ~ahong.net~) 先生,不好意思,我说的是在DLL中
      

  3.   

    对于你用TempForm.show的情况,不用传送Application.Handle.
      

  4.   

    在DLL中将该Form显示出来.
    procedure ShowDllForm; stdcall;
    begin
      if frmDllForm = nil then 
         frmDllForm := TfrmDllForm.Create(nil);
      frmDllForm.Show;
    end;
      

  5.   

    to killghost(kill--ghost):
    我的代码也能将Form显示,但是在关闭程序时出现问题,请看清问题,谢谢
      

  6.   

    你至少还能show,我现在连show都不可以
      

  7.   

    终于搞定了,原来这东西和调用方法有关系,就是说动态调用才可以使用show,至于showmodal倒是无所谓调用方法
      

  8.   

    随便问一句,楼主的调用为什么没有指名调用函数名称呢?procedure CloseMyForm(AFormRef: Longint);stdcall;
      external 'MyLib.dll'
    ====================================================
    procedure CloseMyForm(AFormRef: Longint);stdcall;
      external 'MyLib.dll' name 'CloseMyForm';