Prototype mit Structure in Parameter

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Prototype mit Structure in Parameter

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Prototype mit Structure in Parameter

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Prototype mit Structure in Parameter

Beitrag 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?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Prototype mit Structure in Parameter

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Prototype mit Structure in Parameter

Beitrag von Josh »

Danke
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Prototype mit Structure in Parameter

Beitrag 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?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Prototype mit Structure in Parameter

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Prototype mit Structure in Parameter

Beitrag von Josh »

Du musst immer der erste sein :D. 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Prototype mit Structure in Parameter

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Prototype mit Structure in Parameter

Beitrag 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
Antworten