Einzelnen Beitrag anzeigen

Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#16

Re: Wo ist hier der (Denk-)Fehler? Aufruf von EnumWindowsPro

  Alt 5. Feb 2004, 23:02
Hallo Ustra,

falls Du es doch noch schön objectorientiert machen möchtest, und somit auch auf alle Methoden des Objectes zugreifen kannst. Hier nochmal die Lösung

viele Grüße
stoxx

Code:
unit Unit2;

interface

type Tmyclass = class;

    private
        enumpointer : Pointer;
        function EnumWinProc(WinHandle: HWND; lParam: LPARAM): boolean; StdCall;
    public

        constructor create; virtual;
        destructor destroy; override;
        procedure aufruf;

    end; // von Tmyclass

implementation



function MakeProcInstance(M: TMethod): Pointer;
begin
  // allocate memory
  GetMem(Result, 15);
  asm
    // MOV ECX,
    MOV BYTE PTR [EAX], $B9
    MOV ECX, M.Data
    MOV DWORD PTR [EAX+$1], ECX
    // POP EDX
    MOV BYTE PTR [EAX+$5], $5A
    // PUSH ECX
    MOV BYTE PTR [EAX+$6], $51 
    // PUSH EDX
    MOV BYTE PTR [EAX+$7], $52
    // MOV ECX,
    MOV BYTE PTR [EAX+$8], $B9 
    MOV ECX, M.Code
    MOV DWORD PTR [EAX+$9], ECX
    // JMP ECX
    MOV BYTE PTR [EAX+$D], $FF
    MOV BYTE PTR [EAX+$E], $E1
  end;
end;

//////////////////////////////////////////////////////////////////////////////////

procedure FreeProcInstance(ProcInstance: Pointer);
begin
  // free memory
  FreeMem(ProcInstance, 15);
end;

//////////////////////////////////////////////////////////////////////////////////

constructor Tmyclass.create;
var t : Tmethod;
begin
inherited create;
 t.Code := @Tmyclass.enumwinproc;
 t.Data := self;
 enumpointer := makeProcInstance(t);
end;   // von create

//////////////////////////////////////////////////////////////////////////////////

destructor Tmyclass.destroy;
begin
 FreeProcInstance(enumPointer); // aufräumen
 inherited destroy;
end; /// von free

//////////////////////////////////////////////////////////////////////////////////


function Tmyclass.EnumWinProc(WinHandle: HWND; lParam: LPARAM): boolean; StdCall;
begin

  ... Code

end;   // von enumwindowsprocedure




//////////////////////////////////////////////////////////////////////////////////

  // Aufruf //
procedure Tmyclass.aufruf;
begin
 EnumWindows(enumpointer,0);
end;

end.
  Mit Zitat antworten Zitat