Добавление COM-интерфейса в существующее приложение (EXE)
Я намереваюсь добавить интерфейс COM к существующему приложению (которое, кстати, написано на C++ с использованием Win32). У меня есть некоторый опыт использования COM-объектов, поэтому я знаю основные концепции COM-интерфейсов и т. Д., Но я впервые реализую компонент.
В конечном итоге я хочу иметь возможность использовать интерфейс COM для автоматизации моего приложения из сценариев, таких как VB. Я понимаю, что есть два шага:
- Мое приложение должно действовать как внепроцессный сервер (т.е. я должен использовать MIDL и генерировать код для прокси-DLL и заглушки DLL).
- Получив сервер, я могу добавить возможности автоматизации, реализовав интерфейс IDispatch.
Поскольку работа с сервером в EXE-файле с MIDL, а то, что нет, уже немного крутая, я хотел вначале разобраться во всем этом, прежде чем перейти к IDispatch.
Я читаю книгу "Inside COM" Дейла Роджерсона и завершила главу о серверах в EXE-файлах (следующая глава будет посвящена автоматизации).
В главе "Серверы в EXE" приведен пример кода, который реализует сервер и клиент. Но нужно запустить сервер вручную. Это смущает меня. Очевидно, что когда мое приложение (= сервер) используется клиентским процессом, этот дополнительный шаг вручную не требуется. Нет ли механизма автоматического запуска сервера? Или для этого нужна автоматизация? В настоящее время перспектива запуска моего сервера вручную (если он у меня есть) заставляет меня сомневаться, что я двигаюсь в правильном направлении.
Надеюсь, кто-то с большим знанием этого сможет увидеть, какую информацию мне не хватает, и указать мне правильное направление.
2 ответа
Нет, COM-серверы обычно не запускаются вручную. Не уверен, почему книга предложила это, возможно, потому что он хотел избежать разговоров о ключах реестра, вам нужно, чтобы COM автоматически запускал EXE. В остальном это не очень сложно, вы регистрируете класс приложения для своего приложения с помощью значения ключа LocalServer32, указывающего путь к EXE.
Это, однако, не является чем-то необычным, особенно с существующей программой. Одно из дизайнерских решений - позволить ли клиентскому коду полностью контролировать вашу программу. Или, если ваша программа уже имеет существующий пользовательский интерфейс, но вы также хотите предоставить сервисы другому коду. В последнем случае имеет смысл позволить пользователю запускать приложение вручную, как обычно.
Когда ваша заявка зарегистрирована как LocalServer32
, он будет вызываться с указанной здесь командной строкой, если ни один из запущенных процессов еще не зарегистрировал объект фабрики для вашего CLSID.
Таким образом, вы можете получить лучшее из обоих миров - если приложение уже запущено, этот экземпляр может предоставить серверную часть, а если нет, то он будет запущен.
Автоматизация полностью ортогональна этому - ваш компонент становится совместимым с автоматизацией благодаря реализации IDispatch
,