
Delphi. Создание и использование DLL
Xakep, номер #034, стр. 034-071-2
procedure RunStopHook(State : Boolean)
stdcall; external 'hackpass.dll' index 1;
В этой строке я объясняю Delphi, что есть такая функция RunStopHook, которая находится в написанной мной библиотеке hackpass.dll и ее индекс = 1. Вот по этому индексу Delphi и будет вызывать функцию. Можно, конечно же, и по имени, но это будет немного медленней.
Теперь создай обработчик события для формы OnShow и напиши там:
RunStopHook(true);
И, наконец, создай обработчик события OnClose и напиши:
RunStopHook(false);
Кранты паролям
Все, наше приложение готово. Запусти его. Потом перейди в окно со строкой ввода и кликни там левой кнопкой крысы, удерживая Control. Звездочки моментально превратятся в реальный текст.
Для большего эффекта можешь бросить на форму проги, загружающей DLL, какую-нибудь картинку. Ну а если что-то непонятно, то просто тренируйся. Со временем все само придет. Главное - практика.
Удачи!!! Исходники примера, как всегда, ищи на www.x-c-r.com.
Исходный текст dll файла
library hackpass;
uses Windows, Messages;
var
SysHook : HHook = 0;
Wnd : Hwnd = 0;
function SysMsgProc(code : integer; wParam : word;
lParam : longint) : longint; stdcall;
begin
//Передать сообщение другим ловушкам в системе
CallNextHookEx(SysHook, Code, wParam, lParam);
//Проверяю сообщение
if code = HC_ACTION then
begin
//Получаю идентификатор окна, сгенерировавшего сообщение
Wnd := TMsg(Pointer(lParam)^).hwnd;
//Проверяю тип сообщения.
//Если была нажата левая кнопка мыши
//и удержана кнопка Control, то ...
if TMsg(Pointer(lParam)^).message = WM_LBUTTONDOWN then
if ((TMsg(Pointer(lParam)^).wParam and MK_CONTROL) = MK_CONTROL) then
begin
// Убрать в окне, отправившем сообщение, звездочки
SendMessage(Wnd, em_setpasswordchar, 0, 0);
//Перерисовать окно.
InvalidateRect(Wnd, nil, true);
end;
end;
end;
// Процедура запуска.
procedure RunStopHook(State : Boolean) export; stdcall;
begin
//Если State = true, то ...
if State=true then
begin
//Запускаем ловушку.
SysHook := SetWindowsHookEx(WH_GETMESSAGE,
@SysMsgProc, HInstance, 0);
end
else//Иначе
begin
//Отключить ловушку.
UnhookWindowsHookEx(SysHook);
SysHook := 0;
end;
end;
exports RunStopHook index 1;
begin
end.