Использование обратного вызова в exe между экземплярами DLL

#c #winapi

#c #winapi

Вопрос:

Я написал C exe, который привязывает мою DLL к перехватчикам Windows, что влечет за собой внедрение экземпляра DLL в каждый процесс. Таким образом, у вас есть 1 exe и 1 или более экземпляров DLL в любое время.

Я знаю, что в DLL вы можете использовать #pragma data_seg(...) и комментарий компоновщика для обмена данными между библиотеками DLL, но предостережение заключается в том, что вы не можете обмениваться указателями таким образом по очевидным причинам (динамические адреса памяти, смещения указателей и т. Д.)

Однако, могу ли я пойти в противоположном направлении? То есть в exe есть функция обратного вызова, которую могут вызывать библиотеки DLL? Теория заключается в том, что если я могу определить местоположение этой функции как «фиксированное» в памяти в exe, для любого экземпляра DLL должно быть безопасно вызывать его?

Возможно ли это? Я обеспокоен тем, что exe слишком низкоуровневый для такого подхода.

Если нет, есть ли какой-либо механизм, который я могу использовать для совместного использования одной функции обратного вызова между несколькими экземплярами DLL?

Большое спасибо

Комментарии:

1. Трудно догадаться, как функция обратного вызова связана с общей памятью в DLL. Похоже, вы пытаетесь вызвать функцию в другом процессе. Это нет.

2. По сути, да, это идея. Я не хочу использовать API-интерфейс service / REST и т. Д., Поэтому, возможно, он вернется к чертежной доске. Пытался избежать того, чтобы внедренная DLL была слишком перегружена бизнес-логикой

3. Вы делаете свою жизнь несчастной, используя очень неудобный способ связи между процессами. Разделяемая память — это просто память, она вообще не помогает с требуемой синхронизацией. Именованный канал намного проще запустить.

4. Я открыт для альтернативных подходов, но если у вас есть один, вы должны опубликовать его в качестве ответа, чтобы он мог получить кредит.

5. Я просто догадываюсь об этом. Читать это .

Ответ №1:

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

Что вы можете сделать вместо этого, так это поместить EXE HWND -файл, которым он владеет, в общий сегмент. An HWND может использоваться совместно через границы процесса. Таким образом, несколько экземпляров DLL могут отправлять сообщение этому HWND, когда это необходимо, и EXE может обрабатывать эти сообщения так, как считает нужным.