Проблема взаимодействия 32-битного приложения и 64-битной библиотеки
Разрабатывается 32-разрядное приложение. Сначала оно делалось под Windows XP, потом заказчик захотел, чтобы оно работ
ало и под Висту с 7-кой. Поправили. Но теперь он возжелал, чтобы оно ещё работало и в 64-разрядных версиях Висты и Win7.
И вот здесь появилась проблема. Специфика программы такова, что она внедряет во все другие визуальные приложения свою D
LL. А затем в некоторых случаях общается с ними посредством сообщений.
В 64-битных виндах было замечено, что не
все приложения "контачат" с нашим. Оказалось, что 32-битные приложения в Windows не могут загружать 64-битные DLL (и нао
борот), а в 64-битные процессы может быть внедрена только 64-битная DLL. Соответственно все 64-битные программы оказывал
ись для нас как бы невидимы.
Был найден следующий выход. Собираются 2 версии нашей библиотеки 32 и 64-бит. Основ
ная программа после внедрения 32-битной библиотеки проверяет, не 64-битная ли Windows? Если да, то запускается отдельная
64-битная программа (без окна), которая уже внедряет 64-битную версию той же DLL (которой передаётся хэндл основной про
граммы, чтобы она знала, с кем общаться).
И вот здесь имеено проблема: 64-битная DLL загружается, но не внедряет
ся. Дальше приведу код с комментариями. Может я вообще что-то не то делаю?
Полностью весь код того маленького 64
-битного приложения, которое должно внедрить 64-битную библиотеку:
#include "stdafx.h" #include <windows
.h> #include <stdlib.h> #include "../Inc/trace.h"
int _tmain(int argc, _TCHAR* argv[]) { if(argc == 2) { int _hwnd;
if(!wcscmp(argv[1], L"-unload")) _hwnd = 0; els
e _hwnd = _wtoi(argv[1]); HMODULE hookDll = LoadLibrary(_T("FWHook64.dll")); // загружаем DLL
if(hookDll) { if (_hwnd == 0) trace(true, " 64-bit DLL unloadedn"); else trace(true, " 64-bit DLL
loadedn");
bool res = false; BOOL (WINAPI *SetFWHookProc)(DWORD dwThreadId, HWND wndServerWindow); (FARPROC&)SetFWHookProc = GetProcAddress(hookDll, "SetFWHook"); // ищем в ней нужную функцию
if(SetFW
HookProc) { trace(true, " SetFWHook procedure foundn");
if(_hwnd) res = SetFWHookProc(0,
(HWND)_hwnd); else res = SetFWHookProc(-1, NULL);
if(res) trace(true, " SetFWHook complete su
ccesfuln"); else trace(true, " SetFWHook complete unsuccesfuln"); } FreeLibrary(hookDll); } } return 0; }
trace'ы это запись в лог. В функции SetFWHook просто ставится или снимается глобал
ьный хук при помощи функции SetWindowsHookEx:
SetWindowsHookEx(WH_GETMESSAGE, GetPostMsgProc, g_hinstDll, dwThre
adId);
В логе запись "64-bit DLL loaded" появляется, однако запись "SetFWHook procedure found" не появляется ник
огда. То есть получается, что функция GetProcAddress не выполняется. MSDN говорит, что эта функция находится в Kernel32.
dll, что косвенно говорит о том, что в 64-й винде она может быть реализована по-другому? Или надо использовать другую фу
нкцию?
Какие ещё идеи?
Усложняется ещё тем, что у меня самого процессор и соответственно ОС - 32-битные
((. т.е. самому много тестов мне сделать затруднительно. Я делаю, заказчик у себя запускает и сообщает какие изменения.<
/p>
P.S. Как тут сделать подсветку синтаксиса, не разобрался. Вставлялка кода по-моему просто убирает все переносы с
трок, и пишет весь код в один абзац.
|