【问题标题】:Why does GetActiveObject fail to detect running instance of Outlook?为什么 GetActiveObject 检测不到 Outlook 正在运行的实例?
【发布时间】:2012-01-26 15:58:23
【问题描述】:

我的 windows7 32 位 PC(在 i3 上)遇到问题。我有 Outlook 2010 和 Delphi 7。 我正在使用以下代码来检测 Outlook 是否正在运行。

ClassID := ProgIDToClassID(ClassName);
Result  := (GetActiveObject(ClassID, nil, Unknown) = S_OK);

这失败了,即结果变为错误,但在其他 PC 中这工作正常。

我得到的错误是 MK_E_Unavailable。

更新:

可能只是发生在我身上。

procedure TForm1.Button1Click(Sender: TObject);
function IsObjectActive(ClassName: string): Boolean;
var
  ClassID: TCLSID;
  Unknown: IUnknown;
begin
  try
    ClassID := ProgIDToClassID(ClassName);
    Result  := (GetActiveObject(ClassID, nil, Unknown) =S_OK );
  except
      Result := False;
    end;
end;
begin
  if IsObjectActive('Outlook.Application') Then
    ShowMessage('OutLook is there.')
  else
    ShowMessage('OutLook is not there.')
end;

请注意 OL 正在运行并且

  • 当我运行创建的 exe 时,我收到消息“OutLook is there”。
  • 当我从 Delphi IDE 运行时,我收到消息“OutLook 不存在”。

这种情况总是会发生,我在 Windows 7 上使用 Delphi 7,以管理员身份运行。请告诉我为什么会发生这种情况以及我该如何解决。

Delphi 7 在 Windows 7 上的问题是什么。

请提出建议。

【问题讨论】:

  • 首先要找出GetActiveObject返回的内容并解码HRESULT值
  • 快速网络搜索表明这与完整性级别有关
  • 你正式列出的错误意味着对象没有运行。
  • 另外...从哪里你执行这段代码?定期申请?服务? ISAP dll?
  • 我正在从 Delphi 7 执行上述代码,即它发生在我的开发机器中。

标签: delphi windows-7 outlook delphi-7


【解决方案1】:

这是 GetActiveObject 的条目。
http://msdn.microsoft.com/en-us/library/a276e30c-6a7f-4cde-9639-21a9f5170b62%28VS.85%29

如果您想解码错误,您需要找出 HResult 的含义。
Wikipedia 有一个链接到来自 MS 的 ERR.EXE utility ,它将翻译 HResult 代码成错误描述。对于 COM HResults,请参阅:http://matthewbass.com/2005/11/15/decoding-com-hresult-error-codes/
注意文章中的下载链接已损坏,这是一个工作链接:http://www.softlookup.com/display.asp?id=7113 一旦您知道错误是什么,请更新问题。

如果你想知道一个进程是否在不使用 OLE 的情况下运行,请参阅:How to check if a process is running using Delphi?

另一个选项可能是使用 FindWindowEx 检查 Outlook 2010 特定窗口。
您可以使用WinID (a spy++ clone) 查看 Outlook 2010 使用的窗口。

【讨论】:

  • 我不确定 err.exe 是否是需要的。这是一个 COM HRESULT。
  • @davidhefferman ms 确实会加倍努力来混淆,不是吗。谢谢做了额外的搜索,发现:matthewbass.com/2005/11/15/decoding-com-hresult-error-codes
  • 谢谢 我认为问题出在 OLE 中,我跳过了上面代码的使用。但是在 Windows 7 中使用 Outlook 2010 自动化时卡住了。我附上了代码。 FOutlookApp := TOutlookApplication.Create(self); FOutlookApp.OnQuit:=OutlookOnQuit; FOutlookApp.AutoQuit := 假; FOutlookApp.ConnectKind:= ckRunningOrNew; FOutlookApp.Connect;我收到消息“服务器执行失败”请帮助我。我尝试将 Outlook OLB 作为类型库导入。安装单元时,由于已安装类而出现错误。请帮帮我——
【解决方案2】:

我遇到了同样的问题,我找到了解决方案。

很简单,如果 Outlook 已经在运行,它必须拥有与尝试使用它的进程相同的权限。

简单来说,如果您以管理员权限运行 Outlook,则必须以管理员权限执行您的应用。

您的问题一定是您在没有管理员权限的情况下运行 Outlook,而在具有管理员权限的 Delphi IDE 中运行。因此,当您从 IDE 中启动应用程序时,权限不匹配,您会收到错误消息。这就是为什么在 IDE 之外运行您的应用程序时它按预期工作的原因。因为在 IDE 之外,您的应用在没有管理员权限的情况下运行。

尝试匹配权限。这也是最终用户环境需要考虑的因素。

此外,已知 Windows Vista 及更高版本下的 UAC 会导致此类事物出现多个问题。如果一切都失败了,请禁用 UAC(用户帐户控制,您可以在帐户选项下找到它),然后看看会发生什么。

【讨论】:

    【解决方案3】:

    尝试使用rctrl_renwnd32

    试试这个:

    (FindWindow('rctrl_renwnd32', nil) <> 0)
    

    http://users.skynet.be/am044448/Programmeren/VBA/vba_class_names.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 2020-03-26
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多