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) が得られます。ただし、「DLL プロローグ」というメッセージは Delphi 2007 プログラムでのみ表示され、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、その後の への呼び出しはcodeでTaskDialogIndirect失敗します。これは Win32 エラー コードです。HRESULT$80070057ERROR_INVALID_PARAMETER

DoMessageDlgPosHelpブランチを選択すると、ダイアログが表示されます。

TaskDialogIndirectライブラリ初期化ブロックから呼び出されたときに失敗する理由はわかりませんが、まったく驚くことはありません。できることは厳しく制限されているDllMainため、そこからダイアログを表示しようとしないでください。

于 2013-05-14T06:58:22.670 に答える