首先很抱歉的说,虽然论坛里有很多类似的问题,但我看了所有的解答,做了很多次试验,还是一头雾水。因为我是一个初学者,菜到对传Application的handle都不明白是什么意思,但现在工期赶得很紧,实在没时间从头学起。非常希望有哪位高人可以给我一个调试好的源程序,最好再能告诉我哪里有相关的参考。其实这个功能之前“部分”实现了,不过实现的只是调用一个几乎没什么的MDI子窗体。但是封装我的程序里的子窗体的时候就出现了内存错误,因为子窗体里用了很多ADO,GBGRID等控件,我想可能是和这些有关吧。希望大家能帮忙,等有时间了我一定会认真的来研究这部分内容的,谢谢!

解决方案 »

  1.   

    try  
    CoInitialize(nil);
    //ado控件使用
      finally
        CoUninitialize;
      end;
      

  2.   

    to jerry8:
      我用过这个了,而且在试验的窗体中加了ADO组件,没报错,但当我用在自己的工程窗体上时,就报错了,,,自己的窗体上用了很多的ado,,,,是不是每个都要这样来使用?
      

  3.   

    还有个问题
    try     
    CoInitialize(nil); 
    //ado控件使用 
        finally 
            CoUninitialize; 
        end;在初始化之后,可以进行多个ADO控件的操作吗?还是每个ado的操作都需要单独初始化?
      

  4.   

    //动态创建的时候需要初始化COM组件 关闭的时候需要释放
    ----------------------------关闭---------
    CoInitialize(nil);
      try 
        if Assigned(AdoQuery) then
        begin
          AdoQuery.Active := false;
          AdoQuery.Free;
        end;
        if Assigned(AdoConnection) then
        begin
          if AdoConnection.Connected then
            AdoConnection.Connected := false;
          AdoConnection.Free;
        end;
      finally
        CoUninitialize;
      end;
      

  5.   

    你好,我的ado控件不是动态创建的,是写在程序里的,那该如何处理呢?
      

  6.   

    对了,关于MDI子窗体的调用,大家有很多方法,我都有些糊涂了,能否将你的方法说一说,我刚才对每个ado都做了初始化,可还是报错,,,
      

  7.   

    Exception EInvalidOperation in module QP_QuerRK.dll
    就是这个错误!
      

  8.   

    DLL中的代码如下,frmQueryRK是要封装的窗体
    library QP_QueryRK;uses
      ShareMem,
      SysUtils,
      Forms,
      Classes,
      Detail_frm in 'Detail_frm.pas' {frmDetail},
      QueryRK_frm in 'QueryRK_frm.pas' {frmQueryRK};{$R *.res}
    var
      OldApp:TApplication;procedure Init_frmQueryRK(tmpApp:TApplication);stdcall;
    begin
      OldApp:=Application;
      Application:=tmpApp;
    end;procedure Load_frmQueryRK;stdcall
    begin
      TfrmQueryRK.Create(Application.MainForm);
    end;procedure Final_frmQueryRK;stdcall
    begin
      Application := OldApp;
    end;exports
      Init_frmQueryRK,
      Load_frmQueryRK,
      Final_frmQueryRK;begin
    end.
     
      

  9.   

    以下是主程序的调用代码:
    procedure TfrmMain.FormCreate(Sender: TObject);
    begin
      Init_frmQueryRK(Application);
    end;procedure TfrmMain.N_RKJLCXClick(Sender: TObject);//点击菜单调用dll窗体
    begin
      Load_frmQueryRK;
    end;procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Final_frmQueryRK;
    end;
      

  10.   

    调用DLL中的MDI窗体要把包单独发布,其余的好像不行。
      

  11.   

    调用DLL中的MDI窗体是要带包的,否则会有一些小bug.
      

  12.   

    就是带bpl包。project->options->packages->build with runtime packages 勾选。这些包要求你分发软件的时候带上。
      

  13.   

    其实,你可以在调用程序中调用动态库时就CoInitialize(nil)在程序关闭时或写在application.run后面写上CoUnInitialize就行了。不用每用一个COM控件就加一次。 
      

  14.   

    谢谢楼上的!
    wewaa,我还想再问一下,我之前选择过带包,但发现再发布的时候需要非常多的包,project-> options-> packages-> build   with   runtime   packages   这默认的包都是必须的吗?我有天晚上一个一个的试,错误报少哪个就把哪个添加进来,但后来发现实在太多了,,,,,,,,