Предоставление одного и того же COM-сервера Auto Process Process из нескольких копий одного и того же исполняемого файла - PullRequest
1 голос
/ 16 июня 2011

У меня есть мультимедийное приложение (написанное на Delphi 2010, но я не уверен, что оно полностью актуально), и оно допускает только один экземпляр (через мьютекс).

Один из моих клиентов хотел бы запустить 2 экземпляраприложение, продублировав его установку и все данные приложения, поскольку это позволит ему запустить вывод на две разные звуковые карты, предоставив ему две звуковые зоны.

Теперь я могу разрешить второй экземпляр с помощью переключателя командной строкитаким образом, создавая мьютекс с другим именем и даже позволяя ему отправлять элементы управления любому экземпляру приложения с помощью переключателей командной строки или передачи сообщений Windows.

Мое приложение также предоставляет интерфейс COM для целей автоматизации, очевидно, это обеспечиваетнамного более богатый интерфейс, чем командная строка, и делает его намного проще для извлечения информации из приложения.

Так что моя проблема в том, что, насколько мне известно, я могу предоставить интерфейс COM только одному исполняемому файлу.Теперь я знаю, что это имеет смысл, но мне интересно, может ли кто-нибудь придумать обходной путь к этому.

Я быстро попытался дублировать ключи реестра для моего HKLM \ Software \ Classes \ AppID, таким образом делая AppIDv2 идошло до того, что оно запустило другую копию моего приложения, но я полагаю, что все вышло из-под контроля, когда оно попало в более конкретные GUIDS для TypeLib и т. д. Имейте в виду, я знаю, что я перешагнул границы моих знаний!* Я думаю, что если я смогу создать другую строку AppID и в конечном итоге нацелить исполняемый файл, находящийся в разных местах, то мы по крайней мере сможем выполнить некоторую автоматизацию с помощью сценариев COM Automation, но я подозреваю, что требование GUID в конечном итоге будетподведи меня.

Другой вариант может заключаться в том, чтобы переместить мой COM в inprocess и затем иметь несколько скомпилированных версий моего приложения, которые предоставляют экземпляр основного интерфейса через новые AppID, но это становится беспорядочным, когда вы хотите DLLзнать все о работающем экземпляре вашего приложения.

Любые идеи приветствуются.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

Звучит так, как будто вы хотите зарегистрироваться в таблице Бегущих объектов (ROT).

Я сравниваю вашу проблему с несколькими работающими копиями Excel.COM имеет механизм, позволяющий кому-то найти мои работающие экземпляры Excel и подключиться к одному из них.

Ожидается, что COM-объекты вне процесса зарегистрируют себя в ROT.Затем вызывающие абоненты могут использовать GetActiveObject для поиска вашего экземпляра:

Чтобы автоматизировать приложение Office, которое уже запущено, вы можете использовать функцию API GetActiveObject () для получения IDispatchуказатель на работающий экземпляр.Если у вас есть этот указатель IDispatch для работающего экземпляра, вы можете использовать методы и свойства работающего экземпляра.

Возможно, вам это не понравится, но я считаю, что решение заключается в том, что существует один интерфейс приложения, и это "первое" приложение действует как шлюз для других "экземпляров" вашего приложения (например, вашего сервера автоматизации).

Я не эксперт в областиавтоматизировать процесс COM, но я думаю, что прочитал достаточно, чтобы поверить, что это (к сожалению) ответ.

См. также

0 голосов
/ 16 июня 2011

Вам действительно нужна таблица запущенных объектов (IRunningObjectTable). Ответ Яна в значительной степени правильный.

http://msdn.microsoft.com/en-us/library/ms695276(v=VS.85).aspx

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

Martyn

...