3

下面的 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.

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

编辑

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

4

1 回答 1

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失败并返回HRESULTcode $80070057。这是一个 Win32 错误代码,ERROR_INVALID_PARAMETER.

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

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

于 2013-05-14T06:58:22.670 回答