我用主程序调用一个带ado窗体的DLL文件,窗体可以正常运行,但主程序在退出时出错:
1、"0x004732d6" 指令引用的 "0x00a25108"内存。该内存不能为"read"。要终止程序,请单击“确定”。
2、runtime error 216 at 004732d6
请问是什么问题?

解决方案 »

  1.   

    var
      Form1: TForm1;
      //在要调用DLL文件的程序的var下写
      procedure synapp(App: THandle); stdcall; external 'usedll.dll'; //----你的DLL文件名
      procedure showform; stdcall; external 'usedll.dll'; //----你的DLL文件名implementation
    //需加入math单元
    uses math;
    {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      Synapp(application.Handle);
      Showform;
    end;
    --这是调用的代码
      

  2.   

    procedure synapp(App: THandle); stdcall;
    begin
      Application.Handle := app;
    end;procedure showform; stdcall;
    begin
      Form1 := Tform1.create(application);
      Form1.Show;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      label1.Caption := 'DLL测试程序';
      ADODataSet1.Open;end;initialization
      CoInitialize(nil);
    finalization
      CoUnInitialize;--这是DLL中FORM的代码
      

  3.   

    procedure synapp(App: THandle); stdcall;
    begin
      Application.Handle := app;
    end;
    你将主窗体的句柄赋值给了Application.Handle,原来的Dll句柄要保存下,退出的时候要赋值回去
      

  4.   

    Synapp(application.Handle)这一句引起的    句柄作为动态库参数  传递  可能会引起问题可能是机制问题 具体的我也不是很清楚。可能DELPHI的回收机制 跟DLL有冲突而且你传入的是工程句柄  感觉很不合理
      

  5.   

    说的有道理,LZ可以试试将调用DLL的窗体的句柄传入赋值试试。
      

  6.   

    调用窗体中的代码procedure TForm1.Button1Click(Sender: TObject);
    begin
      Synapp(Form1.Handle);
      Showform;
    end;
      

  7.   

    你的代码有什么特殊要求吗?还是只是简单的在 DELPHI端弹出一个窗体而已
      

  8.   

    。我试过的 没什么问题啊
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      procedure synapp(App: THandle); stdcall; external 'Project1.dll'; //----你的DLL文件名
      procedure showform; stdcall; external 'Project1.dll'; //----你的DLL文件名
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      Synapp(Form1.Handle);
      Showform;
    end;DLL的工程:uses
      SysUtils,
      Classes,
      Windows,
      Messages,
      Variants,
      Graphics,
      Controls,
      Forms,
      Dialogs,
      Unit1 in 'Unit1.pas',
      Unit2 in 'Unit2.pas' {Form2};{$R *.res}
    procedure synapp(App: THandle); stdcall;
    begin
      Application.Handle := app;
    end;procedure showform;stdcall;
    begin
      Form2 := Tform2.create(application);
      Form2.Show;
    end;exports
      synapp,showform;DLL unit1:
    unit Unit1;
    interface
    uses ActiveX;
    implementationinitialization
      CoInitialize(nil);
    finalization
      CoUnInitialize;
      

  9.   

    procedure synapp(App: THandle); stdcall; external 'usedll.dll'; //----你的DLL文件名取消APP参数Form1 := Tform1.create(nil)
      

  10.   

    15楼的兄弟,不知道你运行的时候有没有放adodataset控件,我在没有用adodataset控件连接数据数时是没有问题的。在DLL窗体上加了个adodataset控件并连接数据库返回数据集后,关闭调用DLL文件的窗体时出现了错误。是何原因?
      

  11.   

    应该是你的数据库操作的问题,我用过DLL+Form+ADO没有出现过你说的情况,而且是VB调用
    你最好调试下看看
      

  12.   

    18楼的兄弟,我数据库只做了一个adodataset.open的操作,应该没有什么错误吧
      

  13.   

    兄弟,现在的问题就是,你把这个handle传进去了,但是退出的时候没释放
    你可以在DLL里建立一个对象,输出一个对象,显示窗体以后,然后对象free掉
    或者是在DLL里建一个全局变量,把handle保存一下,关的时候,把handle free掉
      

  14.   

    退出,没有[释放加载的DLL]文件出错
      

  15.   

    同意楼上 ,退出的时候释放DLL文件