Delphi XE3 DllMain中的ShowMessage

时间:2013-05-14 05:49:13

标签: delphi windows-7 delphi-2007 delphi-xe3

下面的DLL是用XE3编译的。

library MyDLL;

uses System.SysUtils, System.Classes, Vcl.Dialogs;

{$R *.res}

var
  II: Integer;

function Test: Integer;
begin
  Result := II;
end;

exports Test;

begin
  II := 5;
  ShowMessage('DLL prolog');
end.

当我从Delphi XE3或Delphi 2007程序中调用函数Test()时,我在两种情况下都得到了正确的结果(5)。但是消息“DLL prolog”仅显示Delphi 2007程序,而不是Delphi XE3程序。为什么呢?

修改

当我使用Delphi 2007主机ShowMessage()从XE3 IDE“运行”dll时也无效。

1 个答案:

答案 0 :(得分:2)

关键在于此功能:

function MessageDlgPosHelp(const Msg: string; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer;
  const HelpFileName: string): Integer;
begin
  if TOSVersion.Check(6) and UseLatestCommonDialogs and
     StyleServices.Enabled and StyleServices.IsSystemStyle then
    Result := DoTaskMessageDlgPosHelp('', Msg, DlgType, Buttons,
      HelpCtx, X, Y, HelpFileName)
  else
    Result := DoMessageDlgPosHelp(CreateMessageDialog(Msg, DlgType, Buttons),
      HelpCtx, X, Y, HelpFileName);
end;

在某些情况下,根据主机应用程序是否具有comctl32 v6清单,会选择if语句的不同分支。

如果选择DoTaskMessageDlgPosHelp分支,则随后对TaskDialogIndirect的调用将失败并显示HRESULT代码$80070057。这是Win32错误代码ERROR_INVALID_PARAMETER

如果选择了DoMessageDlgPosHelp分支,则会显示对话框。

我不确定为什么TaskDialogIndirect在从库初始化块调用时失败,但我并不完全感到惊讶。您在DllMain可以完成的任务中受到严格限制,您不应该尝试从那里显示对话框。