Delphi FAQ - Как внедрить dll в другое приложение?

ОГЛАВЛЕНИЕ

Как внедрить dll в другое приложение?

procedure QryName(threadID: DWord; Caller: HWND); external 'lib0.dll';

procedure TForm1.WMCopydata(var msg: TMessage); // message WM_COPYDATA;
begin
  Caption := PChar(PCopyDataStruct(Pointer(msg.LParam)).lpData);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ahwnd: THandle;
begin
  {Ищем по заголовку}
  ahwnd := FindWindow(nil, PChar(Edit1.Text));
  if ahwnd <> 0 then
    QryName(GetWindowThreadProcessID(ahwnd, nil), Handle);
end;

--- lib0.dpr ---

library lib0;

uses
  Messages,
  Windows;

function Answer( nCode: Integer; wprm: WParam; lprm: LParam): LResult;
stdcall;
type
  PMsg = ^TMsg;
var
  buffer : array [0..MAX_PATH] of Char;
  cd : TCopyDataStruct;
  msg : PMsg;
  Caller : HWND;
  AHook: HHook;
begin
  Result := 0;
  msg := PMsg(lprm);
  if (msg.Message = 0) and (msg.LParam <> 0) then
    begin
      AHook := msg.lParam;
      Caller := msg.wParam;
      cd.cbData := GetModuleFileName(0, buffer, SizeOf(buffer))+1;
      cd.lpData := @buffer;
      cd.dwData := GetCurrentThreadID;
      SendMessage(Caller, WM_COPYDATA, 0, LParam(@cd));
      UnHookWindowsHookEx(AHook);
      PostThreadMessage(GetCurrentThreadID, 0, 0, 0);
    end;
end;

procedure QryName(tid: DWord; Caller: HWND);
var
   AHook : Hhook;
begin
   AHook := SetWindowsHookEx(WH_GETMESSAGE, Answer, Hinstance, tid);
   if AHook <> 0 then
     PostThreadMessage(tid, 0, Caller, AHook);
end;

exports
  QryName;

begin
end.