Seite 1 von 2
Prototype mit Structure in Parameter
Verfasst: 10.10.2012 02:17
von Josh
Hallo,
kann mir wer sagen, wie ich den folgenden Code auf X64 zum laufen bringen kann?
Code: Alles auswählen
EnableExplicit
Prototype.i ProtoAccessibleObjectFromPoint (x.l, y.l, *IAcc, *vt)
Define hDll.i
Define vt.VARIANT
Define CursorPos.point
Define *pIAcc.IAccessible
Define AccessibleObjectFromPoint.ProtoAccessibleObjectFromPoint
CoInitialize_(0)
hDll = OpenLibrary (#PB_Any, "Oleacc.dll")
AccessibleObjectFromPoint=GetFunction (hdll, "AccessibleObjectFromPoint")
GetCursorPos_(@CursorPos)
If AccessibleObjectFromPoint (CursorPos\x, CursorPos\y, @*pIAcc, @vt) = #S_OK
Debug "OK"
EndIf
Laut Microsoft hat AccessibleObjectFromPoint als ersten Parameter eine Structur vom Typ Point, was hier beim Prototyp durch zwei longs ersetzt wurde. Wenn ich das auf X64 probiere, bekomme ich eine Meldung, dass ein Schreibfehler an der Adresse aufgetreten ist, die dem Y-Wert entspricht.
Re: Prototype mit Structure in Parameter
Verfasst: 10.10.2012 02:42
von STARGÅTE
Du kannst ja auch nicht einfach aus einem Parameter zwei machen.
Denn (glaube ich zumindest) es wird ja auf den Stack immer nur ein Vielfaches von 4 (32Bit) bzw. 8 (64Bit) gelegt.
im 32 Bit Fall hast du also glück, das die beiden Longs wirklich zusammen liegen.
Unter 64Bit wird aber 8Byte weiter gegangen, deswegen schreibt er in Y rein, da er ja x und Y bereits in den ersten 8 Byte erwartet hat.
Richtig wäre also, ein Parameter, welcher in dem Fall eine Quad ist, um den Punkt zu beinhalten:
Code: Alles auswählen
EnableExplicit
Prototype.i ProtoAccessibleObjectFromPoint (Point.q, *IAcc, *vt)
Define hDll.i
Define vt.VARIANT
Define CursorPos.point
Define *pIAcc.IAccessible
Define AccessibleObjectFromPoint.ProtoAccessibleObjectFromPoint
CoInitialize_(0)
hDll = OpenLibrary (#PB_Any, "Oleacc.dll")
AccessibleObjectFromPoint=GetFunction (hdll, "AccessibleObjectFromPoint")
GetCursorPos_(@CursorPos)
If AccessibleObjectFromPoint (PeekQ(@CursorPos), @*pIAcc, @vt) = #S_OK
Debug "OK"
EndIf
Re: Prototype mit Structure in Parameter
Verfasst: 10.10.2012 13:28
von Josh
Danke Stargate. Auf das PeekQ hätte ich auch selber kommen können
Das mit den zwei Longs stammt nicht von mir, das was ich gepostet habe ist ein gekürzter Code aus dem Forum. Wahrscheinlich stammte der noch aus einer Zeit, wo es noch keine Quads gegeben hat.
So nebenbei eine andere Frage. Was tun, wenn eine Api eine komplexere Struktur als Point verlangt?
Re: Prototype mit Structure in Parameter
Verfasst: 10.10.2012 13:54
von ts-soft
Josh hat geschrieben:So nebenbei eine andere Frage. Was tun, wenn eine Api eine komplexere Struktur als Point verlangt?
Es wird fast immer eine Strukture ByRef verlangt, also kein Problem. Die wenigen APIs, die eine Strukture
ByVal verlangen kannst Du an einer Hand abzählen und sind IMHO niemals größer als ein Quad.
In älteren Versionen von PB wurden solche Strukturen tatsächlich als 2 Longs übergeben, was keinen Unterschied
macht.
Gruß
Thomas
Re: Prototype mit Structure in Parameter
Verfasst: 10.10.2012 14:19
von Josh
Danke
Re: Prototype mit Structure in Parameter
Verfasst: 12.10.2012 00:10
von Josh
Gehört zwar nicht ganz zum Thema, aber es handelt sich um das gleiche Beispiel. Irgendwie stehe ich momentan auf der Leitung.
Code: Alles auswählen
hDll = OpenLibrary (#PB_Any, "Oleacc.dll")
AccessibleObjectFromPoint=GetFunction (hdll, "AccessibleObjectFromPoint")
Was ich nicht raffe, wo bekomme ich in diesem Fall die #Library für CloseLibrary her?
Re: Prototype mit Structure in Parameter
Verfasst: 12.10.2012 00:15
von STARGÅTE
Die "#Library"-Nummer wird von OpenLibrary() zurückgegeben.
Also dein hDll.
Im übrigen darfst du CloseLibrary() erst beim beenden des Programms aufrufen, vorher würde es sonst ein IMA ausgeben, wenn du mit AccessibleObjectFromPoint auf die Adresse in der DLL zugreifst.
Re: Prototype mit Structure in Parameter
Verfasst: 12.10.2012 00:23
von Josh
Du musst immer der erste sein

. Dafür hats mal ein Danke gegeben.
STARGÅTE hat geschrieben:Die "#Library"-Nummer wird von OpenLibrary() zurückgegeben.
Also dein hDll.
Das ist genau das, was ich nicht raffe. Das was ich hier zurückbekomme, ist das Handle von Windows. Sonst würde das Beispiel nicht funktionieren.
Überall anders (wie z.B. bei OpenWindow oder CreateImage) bekomme ich die #..... Nummer zurück und hole mir dann mit ....ID() das OS-Handle.
Re: Prototype mit Structure in Parameter
Verfasst: 12.10.2012 00:30
von STARGÅTE
Das was ich hier zurückbekomme, ist das Handle von Windows.
Nein ist es nicht.
In deinem Beispiel verwendest du keine Windows-API, auch GetFunction() ist eine PB Funktion, welche eine Library-Nummer verlangt, die entweder dynamisch generiert wurde (#PB_Any) oder eine Konstante.
Das echte OS-Handel der DLL brauchst du hier nie, weil PB das alles verwaltet.
Re: Prototype mit Structure in Parameter
Verfasst: 12.10.2012 00:39
von Josh
STARGÅTE hat geschrieben:In deinem Beispiel verwendest du keine Windows-API
Das war das Stichwort. OMG, wie kann man nur so auf der Leitung stehen.
thxs