【问题标题】:CreateObject on Outlook.Application fails on Outlook 2010 when Outlook is running under a different account当 Outlook 在不同的帐户下运行时,Outlook.Application 上的 CreateObject 在 Outlook 2010 上失败
【发布时间】:2015-03-15 06:08:39
【问题描述】:

我遇到的问题已经在Getting/Creating an Outlook Application in Windows 7 进行了描述,但我很难确定问题的根源,因为我目前正在维护一个旧的 VB6 应用程序,并且报告了错误那篇文章中没有提到来自 VB6 的应用程序。此外,我正在寻找更好的解决方案。

问题是 CreateObject("Outlook.Application")GetObject(,"Outlook.Application") 失败并出现错误 429 - ActiveX 组件无法创建对象,尤其是在 Windows 7 上。问题的根源在于,如果 Outlook 已经在普通用户帐户和以管理员身份运行的应用程序(在 Windows 7 上运行的旧 32 位应用程序并非闻所未闻)想要访问 Outlook,对 Outlook COM 接口的请求挂起 30 秒然后失败。这似乎与请求的 Outlook 实例和已运行的 Outlook 实例使用不同的用户帐户或权限有关。

首先,如果可以报告更好的错误,并且可以更快地报告,那就太好了。通常应用程序在报告错误之前会挂起 30 秒。那么第一个问题是,有没有什么方法可以在不等待 30 秒的情况下检测到这种情况?

接下来,是否有任何方法可以解决此错误,以便我们在想要访问 Outlook API 时不必担心 Outlook 可能已经在不同的凭据下运行?一种想法是关闭 UAC,以便旧的 32 位应用程序不太可能需要以管理员身份运行。有没有更好的解决方案?

【问题讨论】:

  • 我正在使用 FindWindow("rctrl_renwnd32", vbNullString) <> 0 检查 Outlook 是否正在运行。如果是这样并且CreateObject 失败,那么很可能存在完整性级别不匹配。
  • 这并不比假设 CreateObject 失败是这个问题的结果好多少,而不管 FindWindow 结果如何。它仍然需要 30 秒的延迟。
  • 没有别的办法。
  • 如果你能找到窗口,那么这段代码可能会帮助你确定它是否被提升:stackoverflow.com/questions/95912/…
  • 刚刚发布了IsElevated的VB6实现到上面的线程。

标签: com vb6 outlook-2010


【解决方案1】:

我假设你已经解决了这个问题,但以防万一,我遇到了同样的问题,我的解决方案是使用 API 终止 procces Outlook.exe,然后执行“CreateObject”

你可以做接下来的事情: 如果 err.number = 429 那么 terminateprocces ("outlook.exe") '你可以在互联网上找到函数代码 恢复 结束如果

【讨论】:

    【解决方案2】:

    我通过在本地而不是在网络驱动器上安装 VB6 应用程序解决了这个问题。 在快捷方式属性中取消选中以管理员身份运行可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多