调用DLL中的窗体,可是窗体闪了一下就没有了,我用是的showModal,我单步跟踪也没有出现错误,create和showmodal都能通过,我在create和showmodal中间加了一段showmessage('aa');想检测一下,单步跟踪也能通过,但就是不显示'aa'。奇怪。
今天上午还挺好,下午就不行了。这是为什么?

解决方案 »

  1.   

    create;
    showmodal;
    showmessage('aa');
    Free;
      

  2.   

    下面是主主程序中调用DLL的过程
    procedure TFrmMain.ActMk(MstrMK:string);
    //MstrMK:选择运行某个模块程序的编码
    type
        TRunMK = function(jb:Thandle; MstrMk,MstrPath:Pchar):Boolean; stdcall;
    var
        Module : THandle;
        MbooleanVal : Boolean;
        RunMK : TRunMK;
        S : Pchar;
    begin
        MbooleanVal := False;
        S := Pchar(MstrMk);    Module := LoadLibrary('project1.dll');
        if Module > 32 then
        begin
            @RunMk := GetProcAddress(Module,'RunMK');
            if not (@RunMk = nil) then
                MbooleanVal := RunMk(Application.Handle,S,PChar(GetPath(0)));        if not MbooleanVal then showmessage('执行失败!');
        end;
        FreeLibrary(Module);
    end;下面是DLL中响应的单元
    unit RunUnit;
    interfaceuses Forms,Dialogs, SysUtils, Classes, ActiveX;function RunMK(jb:Thandle;MstrMk,MstrPath:Pchar):Boolean;stdcall;implementationuses AbUnit, BbUnit, DMMainUnit, PublicUNIT, SbbUnit, Sc_Jczl_SjjsUnit,
      Sc_Nssb_SjsbUnit, Sc_XxbUnit, SC_XzZzjgUnit;
    function RunMK(jb:Thandle;MstrMk,MstrPath:Pchar):Boolean;
    { 功能:执行选择的模块程序
      输入:Jb:调用的主程序句柄。
            MstrMk : 要调用的模块名:
            MstrPath : 数据库路径。
      输出:成功返回True;否则返回False;
    }
    var
        MJbVal : THandle;
    begin
        MJbVal := Application.Handle;
        Application.Handle := jb;    if MstrMk = 'Ab' then
        begin
            DMMain := TDMMain.Create(Application);
            DMMain.JoinDS(MstrPath);        AbForm := TAbForm.Create(Application);
            AbForm.ShowModal;        DMMain.Free;
        end;    if MstrMk = 'Bb' then
        begin
            //Application.CreateForm(TDMMain,DMMain);
            DMMain := TDMMain.Create(Application);
            DMMain.JoinDS(MstrPath);        BbForm := TBbForm.Create(Application);
            BbForm.ShowModal;        DMMain.Free;
        end;    if MstrMk = 'Sbb' then
        begin
            //Application.CreateForm(TDMMain,DMMain);
            DMMain := TDMMain.Create(Application);
            DMMain.JoinDS(MstrPath);        SbbForm := TSbbForm.Create(Application);
            SbbForm.ShowModal;        DMMain.Free;
        end;    if MstrMk = 'Sc_Nssb_SjSb' then
        begin
            Application.CreateForm(TDMMain,DMMain);
            DMMain.JoinDS(MstrPath);        Sc_Nssb_SjSbForm := TSc_Nssb_SjSbForm.Create(Application);
            Sc_Nssb_SjSbForm.ShowModal;        DMMain.Free;
        end;    if MstrMk = 'Sc_Jczl_Sjjs' then
        begin
            Application.CreateForm(TDMMain,DMMain);
            DMMain.JoinDS(MstrPath);        Sc_Jczl_SjjsForm := TSc_Jczl_SjjsForm.Create(Application);
            Sc_Jczl_SjjsForm.ShowModal;        DMMain.Free;
        end;    Result := True;
        Application.Handle := MJbVal;
    end;
    Initialization
      CoInitialize(nil);Finalization
      CoUnInitialize;end.
      

  3.   

    function RunMK(jb:Thandle;MstrMk,MstrPath:Pchar):Boolean;
    { 功能:执行选择的模块程序
      输入:Jb:调用的主程序句柄。
            MstrMk : 要调用的模块名:
            MstrPath : 数据库路径。
      输出:成功返回True;否则返回False;
    }
    var
        MJbVal : THandle;
    begin
        MJbVal := Application.Handle;       <-------把这一行注释掉
      

  4.   

    我把RunUnit单元重写了一遍也不管用,把DLL的工程文件重建了一遍也不管用。真奇怪了。
      

  5.   

    Linux2001(我想买手提电脑啊!) 按你说的方法做了,还是那样。
      

  6.   

    看上去没有错,把Application.Handle保存恢复去掉,并把Create的参数改为nil,试试
      

  7.   

    procedure TFrmMain.ActMk(MstrMK:string);
    //MstrMK:选择运行某个模块程序的编码
    type
        TRunMK = function(jb:Thandle; MstrMk,MstrPath:Pchar):Boolean; stdcall;
    var
        Module : THandle;
        MbooleanVal : Boolean;
        RunMK : TRunMK;
        S : Pchar;
    begin
        MbooleanVal := False;
        S := Pchar(MstrMk);    Module := LoadLibrary('project1.dll'); <------------放到别处试试
        if Module > 32 then
        begin
            @RunMk := GetProcAddress(Module,'RunMK');
            if not (@RunMk = nil) then
                MbooleanVal := RunMk(Application.Handle,S,PChar(GetPath(0)));        if not MbooleanVal then showmessage('执行失败!');
        end;
        FreeLibrary(Module);  <----------------------------放到别处试试
    end;
      

  8.   

    还有可能是DMMain.JoinDS(...)产生异常,改为try
      DMMain.JoinDS(...);
    except
      ShowMessage('abc');
    end;试试
      

  9.   

    我已解决,我把原来的老的备份中的工程文件和RunUnit单元拷到程序下,替换掉现在的,重新编译了一遍就行了。唉,终于可以回家吃饭。谢谢大家。切记,当你程序正常的时候,一定要常做备份。程序不正常的时候,才看到备份的作用。跟大家交个朋友吧,我是山东人。大家都有分。^_^
      

  10.   

    Module := LoadLibrary('project1.dll');
        if Module > 32 then
        begin
            @RunMk := GetProcAddress(Module,'RunMK');
            if not (@RunMk = nil) then
                MbooleanVal := RunMk(Application.Handle,S,PChar(GetPath(0)));
                                     //---问题    end;//---------再调用时传递Handle不要写Application.Handle,这样会有窗体显示问题
    //---------我也碰到过因为传递Application.Handle出现显示问题
      

  11.   

    to xiaocha(小查) :
    备份程序我看了,和上面的代码一样,我估计是中午有一次非法关机的事(停电),但我重新开机后一切都正常,编译程序都通过了,我尝试重写工程文件和RunUnit单元也不行。
    下面是备份的RunUnit单元:unit RunUnit;
    interfaceuses Forms, Dialogs, SysUtils, Classes, ActiveX;function RunMK(jb:Thandle; MstrMk,MstrPath:Pchar): Boolean;stdcall;implementationuses AbUnit, PublicUNIT, SbbUnit, BbUnit, DMMainUnit, NormalUnit,
      Sc_Nssb_SjsbUnit, Sc_Jczl_SjjsUnit, Sc_XxbUnit, SC_XzZzjgUnit;
    function RunMK(jb:Thandle; MstrMk,MstrPath:Pchar): Boolean;
    { 功能:执行选择的模块程序
      输入:Jb:调用的主程序句柄。
            MstrMk : 要调用的模块名:
            MstrPath : 数据库路径。
      输出:成功返回True;否则返回False;
    }
    var
        MjbVal : THandle;
    BEGIN
        MjbVal := application.Handle;
        application.Handle := jb;    if MstrMk = 'Ab' then
        begin
            Application.CreateForm(TDMMain,DMMain);
            DMMain.JoinDS(MstrPath);        AbForm := TAbForm.Create(Application);
            AbForm.ShowModal;        DMMain.Free;
        end;    if MstrMk = 'Bb' then
        begin
            Application.CreateForm(TDMMain,DMMain);
            DMMain.JoinDS(MstrPath);        BbForm := TBbForm.Create(Application);
            BbForm.ShowModal;        DMMain.Free;
        end;    if MstrMk = 'Sbb' then
        begin
            Application.CreateForm(TDMMain,DMMain);
            DMMain.JoinDS(MstrPath);        SbbForm := TSbbForm.Create(Application);
            SbbForm.ShowModal;        DMMain.Free;
        end;    Result := True;
        application.Handle := MjbVal;
    end;Initialization
      CoInitialize(nil);Finalization
      CoUnInitialize;
    end.