首页  编辑  

如何调用DLL里的MDI子窗体?

Tags: /超级猛料/DLL.动态链接库/   Date Created:
应用是MDI结构,同时想做动态模块的添加,所以就把主程序做成MDI窗体,所有其他子模块都以DLL的形式,子模块的窗体都是MDI子窗体,都放在DLL里,但是调用这些DLL中的子窗体的时候,总是提示"没有当前活动的MDI窗体"!怎么解决呀?

将Application和MDIFrame作为参数传递给DLL。
DLL中的Application.Handle默认是0。
多谢了! :)  我用下面的方法试了一下可以:
function _Close: HRESULT; stdcall;
file: // 系统关闭之前,需要调用本方法
begin
    Application := TmpOldApp;
    // TmpOldApp是全局变量,用于存放DLL的Application
    // 参见_Open
end;

function _Open(Aapp: TApplication): TDModule; stdcall;
// 创建一个模块,并返回它的指针
// 参数Aapp :主程序的Application
var
    testM: TDMTempModule;
begin
    if Application.Handle = 0 then
        TmpOldApp := Application;
    // 记录DLL的原始Application
    Application := Aapp;
    // 将DLL的Application赋为主程序的Application
    // Application.CreateForm(TFrmtemp, frmtemp);
    // 用这句不行。  ?
    frmtemp := TFrmtemp.CreateParented(Aapp.MainForm.Handle);
    // 创建在DLL中定义的MDI子窗体 TFrmTemp 的一个实例
    // 测试代码
end;
另外在Help里找到这句话:
Note: When writing a DLL that uses VCL forms, assign the window handle
of the host EXE's main window to the DLL's Application.Handle
property. This makes the DLL's form part of the host application.
Never assign to the Handle property in an EXE.
但是好像没用!  :(