Einzelnen Beitrag anzeigen

flash2009

Registriert seit: 15. Dez 2008
11 Beiträge
 
#20

Re: Wie baut man sowas wie writeln/sprintf selbst ?

  Alt 27. Dez 2008, 19:52
Zitat von Cyf:
Ich muss grad zugeben, dass ich nicht so ganz folgen kann, was du überhaupt erreichen willst, aber bedenke dass (im Bezug auf array of const):

a) ein PChar sich nicht mitten im Array befindet, sondern nur ein Zeiger auf den Anfang des Strings und dieser dann irgendwo im Speicher ist, dieser ist selbst nur insgesamt 4 Byte groß
b) in einem array of const jedes Element ein 8 Byte großes TVarRec ist
c) die im TVarRec übergeben Zeiger offenbar nur im Scope der Funktion gültig sind (siehe obiger Link)

Kannst du nochmal kurz und knapp erklären, warum du den Stackpointer manuell manipulieren musst und was es mit deiner DLL auf sich hat?

Ok ich hab alle Posts gelesen und werd mal hier wieder ansetzen.
-------------
Zu erst, ich hab nen Hook entwickelt der die Original Api(function) mit meiner function austauscht und die Original function trozdem noch verfügbar hält um Parameter oder rückgabe Werte zu ändern bevor der Original Code weiter läuft. (der hook ist fertig und eigentlich perfekt, einzige Einschränkung er kann nur functions hooken die in Visual Studio gemacht wurden aber das ist jetzt ne Nebensache.)
-------------
So jetzt zu sprinft die ich hooken will, eine function aus der c++ library
int sprintf ( char * str, const char * format, ... );

Rückgabewert (Integer), Parameter(Pointer auf einen Buffer,ein PChar, eine beliebige Anzahl an Parametern), das ganze ist Standard c++ also cdecl (Parameter von rechts nach links pushen und der Stack wir vom Code der die function called wieder bereinigt(add esp, .. ) )
-------------
So jetzt das Problem ist jetzt dieses ... hierbei handelt es sich um sowas wie nen Array aber das Problem ist das ein const array of.. , genau wie call by reference(var ...) nen Pointer auf ne Array struktur übergibt und das geht da leider nicht. Ohne const ist Delphi wiederum nicht in der Lage zu erkennen wie lang der Array ist.

Mein Ansatz war nun das erste Parameter zu nehmen zb nen DWord der hat 4 Byte und über ein @ and die Adresse zu kommen , somit hab ich die Adresse vom ersten Parameter alle weiteren sind immer 4 Bytes weiter.Das ist jetzt nicht schön aber funktioniert schonmal.

gruß flash
Miniaturansicht angehängter Grafiken
huk2vq1_871.png   hukiw1_105.png  
  Mit Zitat antworten Zitat