Каждая программа работает в своем виртуальном адресном пространстве. Поэтому заставить одну программу вызывать функции другой не так просто: в виртуальной памяти 1й проги функций 2й попросту нет.
Если DLL пишется самостоятельно, можно заставть ее отправлять сообщения окну основной проги (через SendMessage), а основную прогу на них реагировать должным образом. Для этих целей хорошо подходят сообщения с номерами WM_USER и далее. Обратную связь можно реализовать также: в ДЛЛ создать невидимое окно, и через него отправлять результат.
Иначе решения будут сложнее. Например, скопировать код нужных функций в память другого процесса (через WriteProcessMemory) и вызывать их там, дописав в DLL-ку адреса скопированных функций. Но этот способ очень труден, поскольку в копируемых функциях нельзя использовать относительные адреса для работы с глобальными переменными и вызова других функций (поскольку глобальных переменных основной проги в новой вирт. памяти нет, а функции может понадобиться копировать в разные места памяти), и с абсолютными надо быть предельно осторожным (нужно релоцировать). Можно фактически использовать только относительные адреса внутри одной функции, об адресах других (включая WinAPI) узнавать уже внутри нового адресного пространства.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
|