|
#1
|
|||
|
|||
String в dll
Здравствуйте, уважаемые профессионалы!
У меня есть 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; Код:
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. |
#2
|
|||
|
|||
Ну, для начала, если ты хочешь передавать строки из/в dll, то надо еще включить модуль ShareMem (и положить соотв. доп dll). String - это не безопасный тип и память под него выделяется определенным образом.
Вообще, лучше уж тогда поменить String на PChar, вот этот тип безопасен. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
T232006 (20.03.2024)
|