Я создаю программу на основе учебника и хочу иметь возможность подключать свой код к определенным приложениям, чтобы учебник взаимодействовал с приложением.
Мой код подключения работает для большинства приложений, кроме Google Chrome.Я сократил свой код до следующего, чтобы вы могли видеть, что он работает неправильно.
Main.cpp
#include <Windows.h>
#include <iostream>
#include <psapi.h>
#include <Tlhelp32.h>
unsigned long GetProcId( const std::string& name )
{
unsigned long res = 0 ;
HANDLE hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 processInfo ;
processInfo.dwSize=sizeof(PROCESSENTRY32W);
if( !Process32First( hSnapShot, &processInfo ) )
{
CloseHandle( hSnapShot );
return res ;
}
do
{
if( NULL != ( strstr ( strlwr ( processInfo.szExeFile ), name.c_str() ) ) )
{
res = processInfo.th32ProcessID ;
break ;
}
} while(Process32Next( hSnapShot,&processInfo ));
CloseHandle( hSnapShot ) ;
return res ;
}
typedef LRESULT (CALLBACK *DllHookProc)(int nCode, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
unsigned int processid = GetProcId( "chrome.exe" ) ;
if (processid == 0)
{
return 0 ;
}
HINSTANCE dllInstance = LoadLibrary("mydll.dll") ;
if (dllInstance == NULL)
{
return 0 ;
}
DllHookProc hookProc = (DllHookProc)::GetProcAddress(dllInstance, "HookProc");
if ( hookProc == NULL)
{
FreeLibrary(dllInstance);
return 0 ;
}
HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)hookProc,
dllInstance, processid );
if (hook == NULL)
{
FreeLibrary(dllInstance);
return 0 ;
}
return 0 ;
}
Test Dll (mydll.dll)
LRESULT CALLBACK HookProc (int nCode, WPARAM wParam, LPARAM lParam )
{
//Pass to the next chain in the process list
return CallNextHookEx( 0, nCode, wParam, lParam);
}
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
return TRUE;
}
Файл определения
LIBRARY "MYDLL"
EXPORTS
HookProc @1
Все отлично работает (включая получение processId и загрузку библиотеки и getprocaddress) до SetWindowsHookEx, который возвращает NULL с кодом ошибки 87 (недопустимый параметр).
Оба chrome.exe
и мой код 32-битный.
Это работает для кого-то еще или кто-нибудь знает, что это не работает?
Спасибо