我正在尝试使用BTMemoryModule.pas
单元从资源加载dll,但我收到此错误
The specified module could not be loaded
。这些是我使用BTMemoryModule
从exe调用的dll中的过程:
procedure StartHook; stdcall;
begin
if MessageHook=0 then
begin
MessageHook := SetWindowsHookEx(WH_GetMessage,
@GetMsgProc,
HInstance,
0);
if MessageHook = 0 then
ShowMessage(SysErrorMessage(GetLastError));
end;
end;
function GetMsgProc(Code: Integer;
wParam, lParam: Longint): Longint; stdcall ;
begin
Result := CallNextHookEx(MessageHook, Code, wParam, lParam);
end;
答案 0 :(得分:5)
系统范围的挂钩必须使用磁盘中的实际DLL文件,因为它们必须被加载并映射到每个正在连接的正在运行的进程的地址空间。换句话说,每个进程都会执行一个隐式LoadLibrary()
,因此需要加载一个真实DLL的文件名。您不能将基于资源的DLL用于此类挂钩。
答案 1 :(得分:0)
从MSDN documentation开始,有两种方法可以创建钩子:
hMod [in] Type: HINSTANCE
包含钩子的DLL的句柄 lpfn参数指向的过程。 hMod参数必须是 如果dwThreadId参数指定由其创建的线程,则设置为NULL 当前进程以及钩子过程是否在代码中 与当前进程相关联。
dwThreadId [in] Type: DWORD
钩子过程所用线程的标识符 相关。如果此参数为零,则挂钩过程为 与在同一桌面上运行的所有现有线程相关联 调用线程。
由于BTMemoryModule.pas
没有常规DLL模块,您可以尝试使用线程ID参数:
MessageHook := SetWindowsHookEx(WH_GetMessage,
@GetMsgProc,
0,
GetThreadId);
甚至试图让最后两个参数都等于0。