#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 может обрабатывать эти сообщения так, как считает нужным.