Подключение функции DLL в Delphi - PullRequest
2 голосов
/ 17 марта 2011

У меня есть coclass, который проверяет реестр, чтобы определить, установлено ли приложение, но он делает это плохо и не находит более новые версии приложения.В тех случаях, когда установлено конкурирующее приложение, оно будет пытаться открыть это.Если конкурирующее приложение было удалено, программа потерпит крах.Этот coclass определен в файле DLL. У меня нет исходного кода для библиотеки, поэтому я не могу просто изменить это.Я пытался использовать перехват для замены функции на работающую, но это кажется сложным, когда я смотрю документацию MSDN по использованию SetWindowsHookEx.Может ли кто-нибудь предоставить пример использования SetWindowsHookEx или другого метода подключения к Windows?

Спасибо

РЕДАКТИРОВАТЬ: Я хотел бы отметить, что я принял ответ, потому что он работалдля меня.Я не мог использовать другой ответ в то время, когда был задан вопрос, но, похоже, он так же хорош.

Ответы [ 3 ]

6 голосов
/ 17 марта 2011

Вот краткий пример из моей собственной кодовой базы, который показывает самую основную технику перехвата:

unit MethodHooker;

interface

implementation

uses
  SysUtils, Windows, Classes;

procedure Patch(Address: Pointer; const NewCode; Size: Integer);
var
  NumberOfBytes: DWORD;
begin
  WriteProcessMemory(GetCurrentProcess, Address, @NewCode, Size, NumberOfBytes);
end;

type
  PInstruction = ^TInstruction;
  TInstruction = packed record
    Opcode: Byte;
    Offset: Integer;
  end;

procedure Redirect(OldAddress, NewAddress: Pointer);
var
  NewCode: TInstruction;
begin
  NewCode.Opcode := $E9;//jump relative
  NewCode.Offset := Integer(NewAddress)-Integer(OldAddress)-SizeOf(NewCode);
  Patch(OldAddress, NewCode, SizeOf(NewCode));
end;

function GetCursorPos(var lpPoint: TPoint): BOOL; stdcall;
(* The GetCursorPos API in user32 fails if it is passed a memory address >2GB which
   breaks LARGEADDRESSAWARE apps.  We counter this by calling GetCursorInfo instead
   which does not suffer from the same problem. *)
var
  CursorInfo: TCursorInfo;
begin
  CursorInfo.cbSize := SizeOf(CursorInfo);
  Result := GetCursorInfo(CursorInfo);
  if Result then begin
    lpPoint := CursorInfo.ptScreenPos;
  end else begin
    lpPoint := Point(0, 0);
  end;
end;

initialization
  if not ModuleIsPackage then begin
    if not CheckWin32Version(6, 1) then begin
      //this bug was fixed in Windows 7
      Redirect(@Windows.GetCursorPos, @MethodHooker.GetCursorPos);
    end;

end.
5 голосов
/ 17 марта 2011

Для очень хорошего обходного / перехватывающего устройства (может проверять прыжки и применять новое смещение!) Я бы порекомендовал KOLdetours.pas

Я использую это во многих проектах, например, мойAsmProfiler.

Кстати: с обходом пути вы получаете «батут», так что вы также можете вызвать оригинальную функцию!

3 голосов
/ 18 января 2012

Я автор Колдетурс.Лицензия является бесплатной для всех: то есть используйте по своему усмотрению даже в коммерческих программах.В основном это реальный открытый исходный код, не поврежденный никакими лицензиями.Так же, как код, из которого он получен.Это четко указано в заголовке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...