Здравствуйте, уважаемые профессионалы!
У меня есть dll с хуком, отлавливающим нажатие клавиш. Есть объект, тип которого описан в отдельном модуле и используется в dll. Есть массив, где хранится количество каждой нажатой клавиши по адресу wParam и строка, которая логгирует все нажатия.
Код:
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
Код:
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 //key is pressed
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, то оказывается, что в объекте массив хранит записи, а строка - нет. Еще раз: при ловле хуков строка сохраняется, а при вызове функции - нет. Почему так происходит?