Moin!
Dalai wrote:Soweit war mir das schon klar. Aber vorher wird ja im DllStructCreate schon ein ptr erzeugt, der nachfolgend als ptr* benutzt wird. Gesamt also ein Pointer auf einen Pointer auf einen Pointer, oder fügt DllStructGetPtr gar einen weiteren Pointer hinzu? Oder verstehe ich was falsch?
Es ist so:
DllStructCreate erzeugt eine Struktur, welcher Art und Größe auch immer.
Hier wird ein "ptr" erzeugt; in reinen 32-Bit-Umgebungen könnte man auch "INT", "BOOL", "LONG", "UINT", "DWORD" etc. pp. angeben, alles wurscht, weil alles 32 Bit groß.
Dann holt man sich mit DllStructGetPtr einen Zeiger auf die Struktur, in diesem Fall also einen Zeiger auf einen Zeiger, und übergibt
Wow64DisableWow64FsRedirection damit, was es will, nämlich einen void**, was man "DllCall" durch die Angabe von "ptr*" als vierten Parameter auch kenntlich macht, vgl. AutoIt-Doku: "
Add * to the end of another type to pass it by reference. For example "int*" passes a pointer to an "int" type."
Beim Aufruf von
Wow64RevertWow64FsRedirection, sagt man "DllCall" dann nur noch "ptr" und übergibt folgerichtig $pRedirect und nicht DllStructGetPtr($pRedirect), weil die Funktion einen PVOID erwartet, also einen void* und nicht einen void**.
Dalai wrote:Ich hasse Pointer. Ich bin eher in Delphi zuhause, wo man sich darum im Normalfall nicht kümmern muss.
Warum?
Streiche "Pointer", setze "Adresse (von)".
Ich hab' auch mit TurboPascal und Delphi angefangen *seufz*, und der Grund dafür, dass man das Pointer-Konzept dort (vermeintlich) in der Regel nicht braucht, liegt einzig und allein in der Syntax von Funktions- und Prozeduraufrufen:
- "normaler" Parameter = "call by value"
- VAR-Parameter = "call by reference" = Pointer!
Viele Grüße
Torsten