如何使用BTMemoryModule获取HInstance

时间:2011-11-11 23:47:01

标签: delphi

我正在尝试使用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;

2 个答案:

答案 0 :(得分:5)

系统范围的挂钩必须使用磁盘中的实际DLL文件,因为它们必须被加载并映射到每个正在连接的正在运行的进程的地址空间。换句话说,每个进程都会执行一个隐式LoadLibrary(),因此需要加载一个真实DLL的文件名。您不能将基于资源的DLL用于此类挂钩。

答案 1 :(得分:0)

MSDN documentation开始,有两种方法可以创建钩子:

  • 使用DLL模块句柄;
  • 使用线程ID。
  

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。