Проблема, с которой я сталкиваюсь, уже описана в Getting/Creating an Outlook Application in Windows 7, но мне было очень трудно определить источник проблемы, потому что я оказался поддерживая в то же время старое приложение VB6, и ошибки, о которых сообщается в приложениях VB6, не упоминаются в этой статье. Кроме того, я ищу лучшие решения.CreateObject в Outlook.Application не работает в Outlook 2010, когда Outlook работает под другой учетной записью
Проблема заключается в том, что ошибки CreateObject("Outlook.Application")
и GetObject(,"Outlook.Application")
с ошибкой 429 - компонент ActiveX не может создать объект, особенно в Windows 7. Источником проблемы является то, что если Outlook уже работает под обычной учетной записью пользователя и приложение работает как администратор (не неслыханно для старых 32-разрядных приложений, работающих под управлением Windows 7) хочет получить доступ к Outlook, запрос на интерфейс COM Outlook зависает в течение 30 секунд, а затем сбой. Похоже, что это связано с тем, что запрашиваемый экземпляр Outlook и уже запущенный экземпляр Outlook используют разные учетные записи пользователей или привилегии.
Было бы хорошо, прежде всего, сообщить о лучшей ошибке, и если бы это можно было сообщить быстрее. Обычно приложение зависает в течение 30 секунд, прежде чем сообщать об ошибке. Итак, первый вопрос: есть ли способ обнаружить это условие, не дожидаясь 30 секунд?
Далее, есть ли способ обойти эту ошибку, поэтому нам не нужно беспокоиться о том, что Outlook может работать под разными учетными данными, когда мы хотим получить доступ к API Outlook? Одна мысль заключается в отключении UAC, так что старое 32-битное приложение с меньшей вероятностью должно запускаться как администратор. Есть ли лучшее решение?
Я использую 'FindWindow (" rctrl_renwnd32 ", vbNullString) <> 0', чтобы проверить, работает ли Outlook. Если это так и 'CreateObject' терпит неудачу, то довольно правдоподобно, что существует несоответствие уровня целостности. – wqw
Это не намного лучше, если предположить, что сбой CreateObject является результатом этой проблемы, независимо от результата FindWindow. Он по-прежнему влечет за собой 30-секундную задержку. – BlueMonkMN
Нет другого пути. –