下面的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时也无效。
答案 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
可以完成的任务中受到严格限制,您不应该尝试从那里显示对话框。