Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.03.2024, 00:17
T232006 T232006 вне форума
Прохожий
 
Регистрация: 17.11.2022
Сообщения: 49
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию 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;
сама 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, то оказывается, что в объекте массив хранит записи, а строка - нет. Еще раз: при ловле хуков строка сохраняется, а при вызове функции - нет. Почему так происходит?
Ответить с цитированием
  #2  
Старый 20.03.2024, 06:10
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, для начала, если ты хочешь передавать строки из/в dll, то надо еще включить модуль ShareMem (и положить соотв. доп dll). String - это не безопасный тип и память под него выделяется определенным образом.
Вообще, лучше уж тогда поменить String на PChar, вот этот тип безопасен.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
T232006 (20.03.2024)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter