gpt4 book ai didi

delphi - 为什么我的 IMessageFilter 并不总是有效?

转载 作者:行者123 更新时间:2023-12-03 15:42:35 28 4
gpt4 key购买 nike

我正在研究 Word 自动化,为了消除“调用被被调用者拒绝”/“消息过滤器指示应用程序正忙”错误,我实现了 IMessageFilter。当我直接自动化 Word 时,消息过滤器就像一个魅力:

Word.Documents.Open(...)
Document.SaveAs(...)

但是当我调用 TOleContainer.DoVerb(ovPrimary) 时,当 Word 显示模式对话框时,我仍然收到错误。为什么 MessageFilter 不能与 TOleContainers DoVerb 方法一起使用?

最佳答案

当Word处于交互状态(即显示对话框)时,您总是会收到“调用被被调用者拒绝”的信息。这并不限于Word。 Excel 也会发生这种情况,例如当用户编辑单元格时。而且它在用户界面中也不必很明显。当您开始编辑单元格、将焦点移至另一个应用程序并返回 Excel 时,UI 不会给您任何线索,但它仍处于“交互”模式,并且会拒绝自动化调用,并显示“调用被被调用者拒绝”错误。

因此,基本上,当您将 Word 与用户交互(而不仅仅是在后台进程中的 Word)结合起来实现自动化时,您应该准备好获取并处理这些错误。

编辑如果您想在调用任何其他 COM 方法之前知道 Excel 或 Word 是否处于交互模式:只需询问 COM 服务器是否“就绪”即可:

Result := _GetActiveOleObject('Excel.Application');

try
aSharedInstance := not VarIsClear(Result);
if aSharedInstance then
Version := Result.Version; // If this produces an exception, then use a dedicated instance.

// In case checking the version does not produce an exception, but Excel still isn't
// ready, we'll check that as well.
// By the way, for some unclear reason, partial evaluation does not work on .Ready,
// so we'll do it like this:
if aSharedInstance and (StrToIntDef(StringBefore('.', Version), 0) >= EXCEL_VERSION_2002) then
aSharedInstance := Result.Ready;
except
aSharedInstance := False;
end;

if not aSharedInstance then
Result := CreateOleObject('Excel.Application');

更新显然,Word 没有“Ready”属性(谁说 Microsoft 是一致的?)。在这种情况下,您需要通过在实际调用之前调用一个简单(且快速)的属性来自行确定其准备情况,并假设当抛出异常时,Word 尚未准备好。在上面的示例中,Version 是在 Ready 属性之前检索的。如果抛出异常,我们就假设应用程序(本例中为 Excel)尚未准备好并相应地继续。

大致如下:

while Tries <= MaxTries do
try
Version := Word.Version;
Tries := MaxTries + 1; // Indicate success
Word.TheCallYouReallyWantToDo;
except
Inc(Tries);
sleep(0);
end;

注意当对话框打开时,Word.Version不会引发异常,因此这对于确定 Word 是否准备就绪没有用。 :( 你必须尝试找到一个可以做到的。

关于delphi - 为什么我的 IMessageFilter 并不总是有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3913469/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com