...
Application myApp = new Microsoft.Office.Interop.InfoPath.Application();
XDocument = myApp.XDocuments.NewFromSolution(TemplateURL);
...
Собрал библиотеку, все работает на ура!, но не в Windows Service.
При использовании библиотеки сервисом получаю исключение: Retrieving the COM class factory for component with CLSID {8075535F-5146-11D5-A672-00B0D022E945} failed due to the following error: 80080005.
К данной ошибке есть комментарий мелкософта, но выполнить все указания не получается.
Компонент 8075535F-5146-11D5-A672-00B0D022E945 зарегистрирован в реестре, но его нет в службе компонентов. Управлять им не получается.
Сервис запущен из под меня. Если обернуть в EXE, то все работает. Если нет то нет.
Вопрос: кто сталкивался, как можно обойти, исправить, подправить или может подучить что?
Здравствуйте, DPintelin, Вы писали:
DP>Задача: программно запускать приложение MS Office InfoPath 2003, загружать шаблон, моделировать действия пользователя, закрывать приложение.
DP>При использовании библиотеки сервисом получаю исключение: DP>Retrieving the COM class factory for component with CLSID {8075535F-5146-11D5-A672-00B0D022E945} failed due to the following error: 80080005.
AFAIU y тебя же ошибка "доступ запрещен" (важна по сути только последняя цифра — 5 — эти коды ошибок еще со времен DOS). Просто разреши его. (Component Services / dcomcnfg)
И еще, тут уже несколько раз приводилась статья. Если не читал, рекомендуется к прочтению.
Re[2]: Ошибка вызова COM объекта из dll в Windows Service
bnk>AFAIU y тебя же ошибка "доступ запрещен" (важна по сути только последняя цифра — 5 — эти коды ошибок еще со времен DOS). Просто разреши его. (Component Services / dcomcnfg)
Так нет этого компонента в dcom, деинсталляция приложения не помогает. Может есть другие способы регистрации компонентов?
Re[3]: Ошибка вызова COM объекта из dll в Windows Service
Эта ошибка к безопасности прямого отношения не имеет. 0x80080005 — это CO_E_SERVER_EXEC_FAILURE из пространства FACILITY_WINDOWS. И описанное в MSDN тоже вряд-ли Ваш случай. Ошибка "обобщённого" характера, за ней может скрываться что угодно. Судя по тексту, возвращает её Вам DllGetClassObject, то есть происходит сбой при попытке получить IClassFactory. Что там не хватает Вашему InfoPath, издалека сказать вряд-ли возможно, нужно на месте разбираться.
"Нормальные герои всегда идут в обход!"
Re[3]: Ошибка вызова COM объекта из dll в Windows Service
Здравствуйте, DPintelin, Вы писали:
DP>Здравствуйте, bnk, Вы писали:
DP>Так нет этого компонента в dcom, деинсталляция приложения не помогает.
Какого компонента? GUID которого в ошибке указан что ли?
AFAIU права надо ставить на Infopath Application. Если его нету в "Component Services" напрямую, то должен присутствовать в виде {GUID}. Хотя насчент InfoPath конкретно не уверен, для других офисных приложений это так.
DP>Может есть другие способы регистрации компонентов?
В смысле другие? Другие способы записи в реестр? Ты о чем?
Кстати, под кем у тебя сервис стартует? Чтобы проверить, безопасность это или нет, попробуй просто запустить сервис под собой (установить ему в свойствах в качестве пользователя себя в свойствах). Еще можно попробовать сервис запускть под SYSTEM, но разрешить ему доступ к рабочему столу (галку поставить)
В общем, стандартные шаги, описанные в KB на который я ссылку дал в предыдущем посте.
Re[4]: Ошибка вызова COM объекта из dll в Windows Service
bnk>Какого компонента? GUID которого в ошибке указан что ли?
Да, нет ни {GUID}, ни что то хоть издалека похожего на InfoPath
DP>>Может есть другие способы регистрации компонентов? bnk>В смысле другие? Другие способы записи в реестр? Ты о чем?
О регистрации компонентов в DCOM.
bnk>Кстати, под кем у тебя сервис стартует? Чтобы проверить, безопасность это или нет, попробуй просто запустить сервис под собой (установить ему в свойствах в качестве пользователя себя в свойствах). Еще можно попробовать сервис запускть под SYSTEM, но разрешить ему доступ к рабочему столу (галку поставить)
Стартует и из под меня, не работает. И доступ к рабочему столу тоже давал. И под LOCAL SYSTEM и создавал еще одну учетку, !так попробывать, все равно не помогает.
Re[5]: Ошибка вызова COM объекта из dll в Windows Service
Здравствуйте, DPintelin, Вы писали:
DP>Стартует и из под меня, не работает. И доступ к рабочему столу тоже давал.
Ну тогда я пас...
Копать дальше можно например по следующим стратегическим направлениям
1. У тебя UAC включен (выключить)?
2. У тебя сервис на .NET (попробовать сделать простейший нативный сервис, который бы создавал твой объект)?
3. Попробовать запустить на чистой системе (виртуальной машине)?
Re: Ошибка вызова COM объекта из dll в Windows Service
Здравствуйте, DPintelin, Вы писали:
DP>Ребята, нужна помощь.
DP>Задача: программно запускать приложение MS Office InfoPath 2003, загружать шаблон, моделировать действия пользователя, закрывать приложение.
[...] DP>При использовании библиотеки сервисом получаю исключение: DP>Retrieving the COM class factory for component with CLSID {8075535F-5146-11D5-A672-00B0D022E945} failed due to the following error: 80080005.
DP>К данной ошибке есть комментарий мелкософта, но выполнить все указания не получается.
DP>Компонент 8075535F-5146-11D5-A672-00B0D022E945 зарегистрирован в реестре, но его нет в службе компонентов. Управлять им не получается.
DP>Сервис запущен из под меня. Если обернуть в EXE, то все работает. Если нет то нет.
DP>Вопрос: кто сталкивался, как можно обойти, исправить, подправить или может подучить что?
Я не знаю по поводу 2003. Но 2007 нельзя запускать из сервисов. Microsoft мотивирует это тем, что все компоненты офиса взаимодействуют с desktop а в сервисах с этим проблемы. Ну они тупо запретили class factory!
Я не помню ссылку в technet — но думаю найдешь ее легко.
Best regards,
Oleg Bekhter
Software Developer
Re[2]: Ошибка вызова COM объекта из dll в Windows Service
Здравствуйте, fay, Вы писали:
fay>Я не знаю по поводу 2003. Но 2007 нельзя запускать из сервисов. Microsoft мотивирует это тем, что все компоненты офиса взаимодействуют с desktop а в сервисах с этим проблемы. Ну они тупо запретили class factory! Я не помню ссылку в technet — но думаю найдешь ее легко.
Я думаю что ты ошибаешься... Или давай пруфлинк
Помтому как "запретить class factory" при запуске офиса из как-то сервиса не представляется физически возможным
Скорее у топикстартера какие-то другие проблемы. В смысле, офисные приложения МОГУТ быть запущены из сервиса, просто НЕ РЕКОМНДУЕТСЯ так делать (из-за проблем с профилем пользователя, лицензией офиса, модальных диалогов, и т.п. — причин куча, большинство описано в KB по ссыслке выше). Но "в принципе" блокировки на это нет. То есть, это сделать можно, в том числе с 2007 офисом, и у меня проблем нет — только что проверил, размножаются с огромной скоростью
Здравствуйте, bnk, Вы писали:
bnk>Здравствуйте, fay, Вы писали:
fay>>Я не знаю по поводу 2003. Но 2007 нельзя запускать из сервисов. Microsoft мотивирует это тем, что все компоненты офиса взаимодействуют с desktop а в сервисах с этим проблемы. Ну они тупо запретили class factory! Я не помню ссылку в technet — но думаю найдешь ее легко.
bnk>Я думаю что ты ошибаешься... Или давай пруфлинк bnk>Помтому как "запретить class factory" при запуске офиса из как-то сервиса не представляется физически возможным bnk>Скорее у топикстартера какие-то другие проблемы. В смысле, офисные приложения МОГУТ быть запущены из сервиса, просто НЕ РЕКОМНДУЕТСЯ так делать (из-за проблем с профилем пользователя, лицензией офиса, модальных диалогов, и т.п. — причин куча, большинство описано в KB по ссыслке выше). Но "в принципе" блокировки на это нет. То есть, это сделать можно, в том числе с 2007 офисом, и у меня проблем нет — только что проверил, размножаются с огромной скоростью
.
bnk>Если сервис запускается под системным аккаунтом, то топикстартеру можно еще попробовать вот это: bnk>http://social.msdn.microsoft.com/Forums/en-US/innovateonoffice/thread/b81a3c4e-62db-488b-af06-44421818ef91
bnk>Хотя рекомендуется все же забить, что, я надеюсь, он и сделал
Возможно я слишком эмоционально выразился насчет class factory — но от датчан можно ожидать все, что угодно
Visual Studio Team находится в соседнем здании, но ни мне. ни другим (даже за пивом) не удалось узнать у StudioTeam, почему ncb данные расстреливаются в памяти. И для того, чтобы Dialog Wizard нормально работал — достаточно закрыть/открыть студию
Из внешних ссылок можно глянуть на КВ257757
Такое ощущение, что и багфиксеры их отдела не могут это понять
Чего только стоит вот эта фраза
Microsoft strongly recommends that developers find alternatives to Automation of Office if they need to develop server-side solutions. Because of the limitations to Office's design, changes to Office configuration are not enough to resolve all issues. Microsoft strongly recommends a number of alternatives that do not require Office to be installed server-side, and that can perform most common tasks more efficiently and more quickly than Automation.
Best regards,
Oleg Bekhter
Software Developer
Re[4]: Ошибка вызова COM объекта из dll в Windows Service
Здравствуйте, fay, Вы писали:
fay>Возможно я слишком эмоционально выразился насчет class factory — но от датчан можно ожидать все, что угодно fay>Visual Studio Team находится в соседнем здании, но ни мне. ни другим (даже за пивом) не удалось узнать у StudioTeam, почему ncb данные расстреливаются в памяти. И для того, чтобы Dialog Wizard нормально работал — достаточно закрыть/открыть студию fay>Из внешних ссылок можно глянуть на КВ257757 fay>Такое ощущение, что и багфиксеры их отдела не могут это понять fay>Чего только стоит вот эта фраза
Ни слова не понял, ну да ладно, предлагаю замять для ясности
Re[6]: Ошибка вызова COM объекта из dll в Windows Service
Здравствуйте, bnk, Вы писали:
bnk>1. У тебя UAC включен (выключить)? bnk>2. У тебя сервис на .NET (попробовать сделать простейший нативный сервис, который бы создавал твой объект)? bnk>3. Попробовать запустить на чистой системе (виртуальной машине)?
Спасибо тебе за советы.
Я частично смоделировал проблему на чистом стенде, и что оказалось.
Приложение с открытым шаблоном не отвечало из-за наличия сертификата, который необходимо было разрешить в системе. Понял я это при работе на стенде с консоли! mstsc /console или /admin, так как именно на консоль выводилось окно приложения.
Что я сделал на проблемной машине:
0. Логин на машину с проблемами, в терминальной сессии и на консоль.
1. Старт своего сервиса использующего библиотеку под LOCAL SYSTEM + Desktop в терминальной сессии.
2. В терминальной сессии просто зависший процесс, на консоли запустилось приложение без открытого шаблона.
3. На консоли руками открыл шаблон, разрешил сертификат, закрыл приложение.
4. Повторный старт сервиса + выполнил все как и задумывалось.
Это описанная ситуация при запуске из под LOCAL SYSTEM + Desktop.
Так как в реалии для открытия шаблона требуется аутентификация пользователя на сервере приложений.
Запуск сервиса из под LOCAL SYSTEM + Desktop приводит к появлению окна аутентификации для ввода пользователя и пароля, значит предполагается участие пользователя.
При запуске из под доменной учетной записи которой разрешен доступ к шаблону, получаю ошибку вызова COM объекта из dll (80080005)
Такие пироги.
Как бы реализовать все красиво?
Re[7]: Ошибка вызова COM объекта из dll в Windows Service