DLL中的无模式窗体问题

来源:互联网  时间:2016/8/26 5:45:57

关于网友提出的“ DLL中的无模式窗体问题”问题疑问,本网通过在网上对“ DLL中的无模式窗体问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: DLL中的无模式窗体问题
描述:

我用的是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;
interface
uses
  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事件中加上关闭窗体的代码,也会出现同样的错误。
请问这是什么原因??应该怎样解决??谢谢

上一篇已知窗体句柄,如何根据它获得窗体内所有控件的名称及其句柄?
下一篇急!如何在一个应用程序中调用另一个应用程序,请高手指教
明星图片
相关文章
《 DLL中的无模式窗体问题》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)