Здравствуйте, уважаемые профессионалы!
У меня есть dll с хуком, отлавливающим нажатие клавиш. Есть объект, тип которого описан в отдельном модуле и используется в dll. Есть массив, где хранится количество каждой нажатой клавиши по адресу wParam и строка, которая логгирует все нажатия.
Код:
1 2 3 4 5 6 7 8 9 10 11 12 | type
TKeyboardMap= array [ 0..255 ] of word ;
TKeyboard= class
private
mas: TKeyboardMap ;
s: string ;
public
procedure addPress(ws: word ; ls: longint );
property map:TKeyboardMap read mas;
property st: string read s;
constructor create;
end ;
|
сама dll
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | library KeyboardHook;
{$R *.res}
uses
Sharemem,
Messages,
Windows,
KeyboardUnit in 'KeyboardUnit.pas' ;
var SysHook: hHook = 0 ;
keyboard: TKeyboard ;
function GetKeyboard:Tkeyboard; export; stdcall;
begin
result:=keyboard;
end ;
function KeyboardProc(Code: Integer ; wParam: WParam; LParam: LParam): integer ; stdcall;
begin
if byte (LParam shr 24 )< $80 then
begin
keyboard . addPress(wParam, lParam);
end ;
result:=CallNexthookEx(SysHook, code, WParam, LParam);
end ;
procedure RunStopHook(State: Boolean ) export; stdcall;
begin
if State then
begin
keyboard:=TKeyboard . create;
SysHook:= SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, hInstance, 0 )
end
else
begin
UnhookWindowsHookEx(SysHook);
SysHook:= 0 ;
keyboard . Destroy;
end ;
end ;
exports RunStopHook, GetKeyboard;
end .
|
Так вот... когда нажимаю на клавишу, хук ловит клавишу, записывает значение в массив и в строку (свойства keyboard.map и keyboard.st) соответственно. И так несколько раз. Но когда я пытаюсь передать объект в основную программу посредством вызова GetKeyboard, то оказывается, что в объекте массив хранит записи, а строка - нет. Еще раз: при ловле хуков строка сохраняется, а при вызове функции - нет. Почему так происходит?