Выполнить внешнюю функцию, принадлежащую другому процессу - PullRequest
0 голосов
/ 05 сентября 2011

Мне нужна помощь с проблемой.У меня запущено 2 процесса, один - Watchdog, а другой - простой процесс тестирования.Мне нужен процесс 2 для вызова кода из сторожевого таймера, поэтому я делаю это для уменьшения размера процесса 2. Например, процесс 2 должен вызвать функцию сторожевого таймера под названием «IsSafe».Функция IsSafe основывается на другом коде, принадлежащем процессу Watchdog, и переписать этот код для процесса 2 не удастся. Я подумал над идеями, пожалуйста, не могли бы вы посоветовать, какое решение является лучшим, или дать совет.

Idea One

Использование именованных каналов для связи между процессами и передачи параметров и возврата значений вокруг.

Idea Two

Используйте Share Memory для обмена параметрами и возвращаемыми значениями

Идея Три

Используйте сообщения Windows, я, честно говоря, думаю, что это не будет работать

Идея Четыре

Каким-то образом создайте исполняемую часть совместно используемой памяти и выполните этот код с дальней дистанцией.

Пожалуйста, не могли бы вы посоветовать.

Ответы [ 4 ]

2 голосов
/ 05 сентября 2011

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

Кстати, для связи между процессами на одном компьютере с Windows без COM используйте почтовые слоты.

Кажется, вы забыли о них в своем списке.

Приветствия и hth.,

0 голосов
/ 05 сентября 2011

Все, что вам действительно нужно, это немного IPC. Для легкого и простого решения просто определите специфичное для приложения сообщение с помощью WM_APP и получите отображение параметров из wParam / lParam Если вам нужно более 8 байтов, вы можете использовать вместо него WM_COPYDATA.

0 голосов
/ 05 сентября 2011

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

Именованный канал был бы идеальным в этом сценарии, TransactNamedPipeФункция предназначена именно для этого.

0 голосов
/ 05 сентября 2011

DLL - стандартная реализация идеи 4. Она загружается в обоих адресных пространствах, но разделяется в физической памяти.Вам не нужны специальные трюки;он работает везде, и Windows будет решать любые проблемы безопасности для вас.

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

...