- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 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/
来自msdn看来 IMessageFilter 并不能处理所有异常,例如,在某些时候,办公应用程序会“挂起”其对象模型,此时它无法被调用并抛出:0x800AC472 (VBA_E_IGNORE ) 为
我正在研究 Word 自动化,为了消除“调用被被调用者拒绝”/“消息过滤器指示应用程序正忙”错误,我实现了 IMessageFilter。当我直接自动化 Word 时,消息过滤器就像一个魅力: Wor
我仍在尝试找出此错误的原因: OCR.test.IMessageFilter.PreFilterMessage(ref System.Windows.Forms.Message): containin
当鼠标悬停在子控件上时,不会调用 MouseDown 事件。我尝试了 KeyPreview = true; 但它没有帮助(尽管它对 KeyDown - 键盘点击有用)。 我正在寻找类似 KeyPrev
我想实现IOleMessageFilter,如下所述: How to: Fix 'Application is Busy' and 'Call was Rejected By Callee' Erro
我正在尝试使用 Python.net 在 Winforms 应用程序中添加自定义 IMessageFilter,但出现段错误。 这是一个最小的示例应用程序: import clr clr.AddRef
我是一名优秀的程序员,十分优秀!