Проблема взаимодействия 32-битного приложения и 64-битной библиотеки
Разрабатывается 32-разрядное приложение. Сначала оно делалось под Windows XP, потом заказчик захотел, чтобы оно работало и под Висту с 7-кой. Поправили. Но теперь он возжелал, чтобы оно ещё работало и в 64-разрядных версиях Висты и Win7. И вот здесь появилась проблема. Специфика программы такова, что она внедряет во все другие визуальные приложения свою DLL. А затем в некоторых случаях общается с ними посредством сообщений.
В 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; else _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(SetFWHookProc) { trace(true, " SetFWHook procedure foundn");
if(_hwnd) res = SetFWHookProc(0, (HWND)_hwnd); else res = SetFWHookProc(-1, NULL);
if(res) trace(true, " SetFWHook complete succesfuln"); else trace(true, " SetFWHook complete unsuccesfuln"); } FreeLibrary(hookDll); } } return 0; }
trace'ы это запись в лог. В функции SetFWHook просто ставится или снимается глобальный хук при помощи функции SetWindowsHookEx:
SetWindowsHookEx(WH_GETMESSAGE, GetPostMsgProc, g_hinstDll, dwThreadId);
В логе запись "64-bit DLL loaded" появляется, однако запись "SetFWHook procedure found" не появляется никогда. То есть получается, что функция GetProcAddress не выполняется. MSDN говорит, что эта функция находится в Kernel32.dll, что косвенно говорит о том, что в 64-й винде она может быть реализована по-другому? Или надо использовать другую функцию?
Какие ещё идеи?
Усложняется ещё тем, что у меня самого процессор и соответственно ОС - 32-битные ((. т.е. самому много тестов мне сделать затруднительно. Я делаю, заказчик у себя запускает и сообщает какие изменения.
P.S. Как тут сделать подсветку синтаксиса, не разобрался. Вставлялка кода по-моему просто убирает все переносы строк, и пишет весь код в один абзац.
|