开始以为是SDK的问题,单独写了一个后,发现不用SDK一样的要出错。
LoadLibrary时出错.
程序代码如下:
DLL:
library Test;
uses
SysUtils,
Classes,
UnitHook in 'UnitHook.pas';
{$R *.res}
exports SetHook, EndHook;
begin
hNextHookProc := 0;
procSaveExit := ExitProc;
ExitProc := @HotKeyHookExit;
end.
//------------------UnitHook文件:
unit UnitHook;
interface
uses
Windows,SysUtils,Dialogs,Messages;
var
hNextHookProc: HHook;
procSaveExit: Pointer;
function SetHook: BOOL; export;
function EndHook: BOOL; export;
function HookProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall;
procedure HotKeyHookExit; far;
implementation
function HookProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT; stdcall;
var
Hwnd:DWORD;
AppRect:TRect;
Title:PChar;
begin
Result := 0;
Title := '';
if iCode < 0 then begin
CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
Result := 0;
Exit;
end;
if ((lParam and $80000000) = 0) and (wParam = $6A) then begin
Showmessage('*');
end;
end;
function SetHook: BOOL; export;
begin
Result := False;
if hNextHookProc <> 0 then Exit;
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD, HookProc, HInstance, 0);
Result := hNextHookProc <> 0;
end;
function EndHook: BOOL; export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook
hNextHookProc := 0;
end;
Result := hNextHookProc = 0;
end;
procedure HotKeyHookExit;
begin
if hNextHookProc <> 0 then EndHook;
ExitProc := procSaveExit;
end;
end.
//----------------------EXE文件
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
//-----------Dll Start------
TSetHook=procedure;stdcall;
TEndHook=procedure;stdcall;
//-----------Dll End-------
var
Form1: TForm1;
SetHook:TSetHook;
EndHook:TEndHook;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
DllHandle:THandle;
begin
DLLHandle := LoadLibrary(PChar('Test.Dll')); //这里出错
if DllHandle<>0 then begin
@SetHook := GetProcAddress(DLLHandle, 'SetHook');
@EndHook := GetProcAddress(DLLHandle, 'EndHook');
SetHook;
end;
end;
end.
[课程]Android-CTF解题方法汇总!