Необходимо для Виндовс 2000 написать некоторый модуль, который будет висеть в памяти, выполнять какие-то свои действия и предоставлять некоторые свои функции для вызова сторонними приложениями. Так же необходимо, чтобы эти самые сторонние приложения получали доступ к функциям этого модуля путём простого включения файла заголовков ( с описанием функций ) в проект. Т.е. никакой дополнительной линковки библиотек, относящихся к загруженному модулю, или дополнительного кода в самом приложении.
Вопроса в общем то два — можно ли это сделать и, если можно, то как?
1. Использование DLL не подходит по причине необходимости линковки с дополнительной библиотекой ( при неявной загрузке DLL ) или же по причине добавления в исходники приложения дополнительного кода для явной загрузки DLL.
2. Оптимальным вроде бы является написание сервиса/службы, но я никак не могу найти информации о том, как сделать прямой доступ к их функциям...
Заранее благодарю за ответы.
P.S. Наверное можно ещё оформить этот модуль в виде драйвера... но хотелось бы всё таки пойти по второму пути если это возможно.
Здравствуйте, NightStalker, Вы писали:
NS>Необходимо для Виндовс 2000 написать некоторый модуль, который будет висеть в памяти, выполнять какие-то свои действия и предоставлять некоторые свои функции для вызова сторонними приложениями. Так же необходимо, чтобы эти самые сторонние приложения получали доступ к функциям этого модуля путём простого включения файла заголовков ( с описанием функций ) в проект. Т.е. никакой дополнительной линковки библиотек, относящихся к загруженному модулю, или дополнительного кода в самом приложении.
Здравствуйте, Блудов Павел, Вы писали:
БП>Сделайте COM-сервис в виде службы.
Вполне возможный вариант. Правда я практически не писал СОМ-сервисы, но насколько я знаю ( очень даже может быть, что я ошибаюсь ), для использования функций СОМ-сервиса, в приложении придётся произвести какие-то дополнительные действия...
А хотелось бы придти к такой ситуации, что я в приложении только подключаю .H файл и могу вызывать функции сервиса без каких-то дополнительных действий. Вполне возможно, что сервис для этого будет необходимо каким-то хитрым способом зарегистрировать в системе...
Т.е. к предидущим вопросам добавляется ещё один — нужно ли для использования функций СОМ-сервиса что-то дописывать в приложение его вызывающее?
Насколько я понял хочется использовать функциональность некоторого модуля не привязываясь к нему. Вообще-то это классическая архитектура клиент-сервер. В твоем случае служба должна выступать в роли сервера. Т.е клиентское приложение должно слать запрос (код ф-ии и параметры), а сервер возвращать ответ (результат выполнения). Правда в такой схеме вся сложность в том что ф-ии сервера исполняются в его контексте и передача данных от клиента серверу и обратно не совсем тривиальна. Если все ф-ии сервера можно представить в виде:
DWORD Fun(DWORD arg), то все очень просто: Клиент шлет серверу мессагу с помощью PostThreadMessage( serverId, dwFunCode, clientId, arg), служба должна его отработать и в ответ выслать результат PostThreadMessage( clientId, dwFunCode, resFun, 0).
На самом деле можно использовать любой метод межпроцессорного взаимодействия, который покажется тебе более удобным.
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
NS>Вполне возможный вариант. Правда я практически не писал СОМ-сервисы, но насколько я NS>знаю ( очень даже может быть, что я ошибаюсь ), для использования функций СОМ-сервиса, NS>в приложении придётся произвести какие-то дополнительные действия... NS>А хотелось бы придти к такой ситуации, что я в приложении только подключаю .H файл и NS>могу вызывать функции сервиса без каких-то дополнительных действий. Вполне возможно, NS>что сервис для этого будет необходимо каким-то хитрым способом зарегистрировать в NS>системе...
NS>Т.е. к предидущим вопросам добавляется ещё один — нужно ли для использования функций NS>СОМ-сервиса что-то дописывать в приложение его вызывающее?
грубо говоря кроме CoInitialize() ничего , ничего дополнительного не надо.