Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Hook DLL Fehler (https://www.delphipraxis.net/37564-hook-dll-fehler.html)

yvesdaeschle 7. Jan 2005 11:35


Hook DLL Fehler
 
Hallo Zusammen,

ich brauch dringen Hilfe. Ich programmiere gerade eine Hook DLL, welche mir die Mausereignisse an mein Hauptprogramm schickt. Doch bei dem UninstallHook aufruf, stürzt mir jedes mal, wenn ich debugge, der Rechner ab. Nur als ich das Programm alleine gestartet habe, habe ich den Fehler lesen können. Kann damit aber leider nichts anfangen.

http://www.yvesdaeschle.de/error_d6.gif

Hier der Code der DLL:

Delphi-Quellcode:
library Hook;

uses
  Windows,
  Messages;

type
  TPMsg = ^TMsg;

  PMMFData = ^TMMFData;
  TMMFData = record
    NextHook: HHOOK;
    WinHandle: HWND;
    MsgToSend: Integer;
  end;

var
  HookHandle: Cardinal = 0;
  WindowHandle: Cardinal = 0;

  FileMapObj: THandle;
  FileMapView: ^Integer;

  Kill: Boolean;

  MMFHandle: THandle;
  MMFData: PMMFData;

const
  WM_MOUSEHOOKMSG = WM_USER + 2706;
    MMFName = 'CSMouseHook';

function CreateMMF(Name: string; Size: Integer): THandle;
begin
  Result := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, Size, PChar(Name));
  if Result <> 0 then
  begin
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      CloseHandle(Result);
      Result := 0;
    end;
  end;
end;

function OpenMMF(Name: string): THandle;
begin
  Result := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(Name));
  // The return value is an open handle to the specified file-mapping object.
end;

function MapMMF(MMFHandle: THandle): Pointer;
begin
  Result := MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
end;

function UnMapMMF(P: Pointer): Boolean;
begin
  Result := UnmapViewOfFile(P);
end;

function CloseMMF(MMFHandle: THandle): Boolean;
begin
  Result := CloseHandle(MMFHandle);
end;

function UnMapAndCloseMMF: Boolean;
begin
  Result := False;
  if UnMapMMF(MMFData) then
  begin
    MMFData := nil;
    if CloseMMF(MMFHandle) then
    begin
      MMFHandle := 0;
      Result := True;
    end;
  end;
end;

function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM):
 LRESULT; stdcall;
begin

  Result := 0;
  MMFHandle := OpenMMF(MMFName);
  if MMFHandle <> 0 then
  begin
    MMFData := MapMMF(MMFHandle);
    if MMFData <> nil then
    begin
      if (nCode < 0) or (wParam = PM_NOREMOVE) then
        Result := CallNextHookEx(MMFData.NextHook, nCode, wParam, lParam)
      else
      begin
        Kill := True;
        SendMessage (MMFData.WinHandle, WM_MOUSEHOOKMSG, wParam, lParam);

        //if Kill then TPMsg(lParam)^.message := WM_NULL;
        Result := CallNextHookEx(MMFData.NextHook, nCode, wParam, lParam)
      end;
      UnMapMMF(MMFData);
    end;
    CloseMMF(MMFHandle);
  end;
end;

function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
begin

  Result := False;
  MMFHandle := 0;
  MMFData  := nil;
  Result := False;
  if (MMFData = nil) and (MMFHandle = 0) then
  begin
    MMFHandle := CreateMMF(MMFName, SizeOf(TMMFData));
    if MMFHandle <> 0 then
    begin
      MMFData := MapMMF(MMFHandle);
      if MMFData <> nil then
      begin
        MMFData.WinHandle := hWnd;
//        MMFData.MsgToSend := MsgToSend;
        MMFData.NextHook := SetWindowsHookEx(WH_MOUSE, @MouseHookProc, HInstance, 0);

        if MMFData.NextHook = 0 then
          UnMapAndCloseMMF
        else
          Result := True;
      end
      else
      begin
        CloseMMF(MMFHandle);
        MMFHandle := 0;
      end;
    end;
  end;
end;

function UninstallHook: Boolean; stdcall;
begin
//Hook aus der Hookchain entfernen
//Uninstall hook from hook chain
  Result := False;
  if (MMFData <> nil) and (MMFHandle <> 0) then
    if UnHookWindowsHookEx(MMFData.NextHook) then
      Result := UnMapAndCloseMMF;
end;


exports
//Installations- und Deinstallationsroutine exportieren
//Export the installation and deinstallation routine
  InstallHook,
  UninstallHook;
end.
der Aufruf

Delphi-Quellcode:
function UninstallHook: Boolean; stdcall; external 'mousehook.dll';

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UninstallHook;
end;
Bei Aufruf, kommt der Fehler und ich weis nicht an was es liegt, weil die DLL an sich selber funktioniert!

Weis jemand an was das liegen kann?

Yves

[edit=Christian Seehase]Code-Tags durch Delphi-Tags ersetzt. Mfg, Christian Seehase[/edit]

Christian Seehase 7. Jan 2005 12:11

Re: Brauche dringend Hilfe - DLL Fehler
 
Moin Yves,

korrigiere bitte mal Deinen Thread-Titel.
Dass Du Hilfe brauchst lässt sich denken, sonst hättest Du hier ja keinen aufgemacht.
Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz