【发布时间】: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