Запретить присоединение пользователя к экземпляру процесса MS-Office, выполняемому разработчиком - PullRequest
0 голосов
/ 23 января 2019

Я сталкиваюсь со следующей проблемой: После того, как я запустил любое приложение Ms-Office через COM в своем коде C ++ (Word, Excel, PowerPoint, Visio) и сделал его скрытым - тогда, если пользователь запускает свой собственный экземпляр этого приложения - оно присоединится к run-my-code офисный процесс, пока я понятия не имею об этом. В конце концов, после выполнения моего кода, я закрываю приложение Office, и пользователь теряет свою работу (если он подключился к моему процессу и не запустил собственный)

Итак,

1) есть ли способ запретить пользователю подключаться к моему экземпляру приложения Office и запускать собственный процесс? Может быть, параметр для CoCreateInstance или что-то еще?

2) Или (Еще один вариант) - как определить, что пользователь только что подключился к процессу "За мной"?

Буду признателен за любую помощь.

Вот фрагмент кода о том, как я создаю приложение Office

CComPtr<IDispatch> pOffApp;
hr = pOfficeApp.CoCreateInstance(L"Word.Application", NULL, CLSCTX_LOCAL_SERVER); //may also be "Excel.Application", "Visio.Application" etc.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Раньше там была хорошая статья по КБ, но она исчезла ... Суть была опубликована в ответе на форумах MSDN Бесси Чжао, которую я здесь копирую, с тем, что я помню из объяснения КБниже:

Вы пробовали Обойти обход 188546 КБ: http://support.microsoft.com/kb/188546/EN-US/? Это вводит способ, как показано ниже.Перед созданием объекта Word сначала создайте временный объект Word.После создания вашего объекта закройте временный объект.Это заставляет Word работать правильно, когда вы управляете им с помощью автоматизации (то есть, если пользователь в интерактивном режиме запускает Word, для него открывается новый экземпляр Word).Экземпляр автоматизации остается скрытым и отдельным.Код, подобный этому,

        object missing = Type.Missing;
        Word.Application temp = new Word.Application();
        Word.Application wordApp = new Word.Application();
        wordApp.Visible = true;
        temp.Quit(ref missing, ref missing, ref missing);
        temp = null;
        ...

Причина этого заключается в том, как приложения Office используют ROT (таблицу объектов выполнения).В ROT всегда будет присутствовать только один экземпляр приложения Office - первый запущен.

Если какое-либо другое приложение, кроме Office, создает экземпляр этого приложения, то оно находится в ROT.Office предназначен для поиска работающего экземпляра в ROT и, если он есть, использует его, когда пользователь запускает приложение или открывает документ.Вот почему описанная в вопросе ситуация возможна.

Обходной путь в основном гласит: создайте два экземпляра.Используйте второе, которого не будет в ROT, затем уничтожьте первое.На данный момент ни один экземпляр приложения Office не находится в ROT, поэтому, когда пользователь вызывает его, ничего не находя в ROT, приложение Office создает новый экземпляр, независимый от того, который используется программным обеспечением.

0 голосов
/ 23 января 2019

Получить объект Application. Проверьте Application.Visible свойство. Если приложение видно, вы не должны выходить из приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...