Blitzmax - Dll problem

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

PhillipK

Betreff: Blitzmax - Dll problem

BeitragSo, Dez 05, 2010 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho Community =)

Bin grade dabei für mein Projekt mein wissen zu erweitern, was so Blitzmax angeht.

Da ich schon viel mit AutoIt gearbeitet hab, wollte ich die AutoItX3.dll benutzen, und einen kleinen wrapper schreiben.
Nach tierischem hickhack, wie ich mit bltizmax einen LPCWSTR an eine DLL übergebe (und was überhaupt ein LPCWSTR darstellt *g*), stehe ich vor 2 neuen problemen.

PS: Bitte keine postings ala 'Autoit ist doch eine kindersprache' - ich erwarte nur konstruktive aussagen, auch wenn der sinn meiner arbeit fraglich ist.

Also zu ersteinmal, 2 beispielfunktionen aus einer 'AutoIt3.h' - diese benutze ich, um die parameter rauszufinden Smile

Code: [AUSKLAPPEN]
AU3_API void WINAPI AU3_ClipGet(LPWSTR szClip, int nBufSize);
AU3_API long WINAPI AU3_WinGetPosX(LPCWSTR szTitle, /*[in,defaultvalue("")]*/LPCWSTR szText);


AU3_ClipGet() erwartet einen Pointer auf einen Short[] (ich hoffe es ist short, obgleich alle anderen ideen und google-funde auch nicht geklappt haben) und den buffer size.
Würde mich jetzt nicht weiter stören, wenn ich es schaffen würde, einen funktionierenden pointer zu übergeben Very Happy

Also frage 1: Wie übergebe ich mit BlitzMax einen Pointer auf eine Variable (in diesem fall einen Short Ptr)?
Alle versuche gaben entweder einen fehler und es passierte einfach garnichts. Sad



AU3_WinGetPosX(Title$, Text$) erwartet den title und eventuell vorhandenen text eines Fensters.. Return ist 'long' mit der X-koordinate der linken seite des fensters.
In autoit ist das ganze ja recht einfach.. eine schöne funktion die mir einen array mit x,y,breite,höhe.. Perfekt.
Die werte die ich von der dll erhalte sind allerdings mehr als Fragwürdig.

Zumal ich nicht weiß, wie ich einen long-c? cpp? wert brav nach int oder gar short Konvertiere Smile Egal was ich angebe, ich erhalte nur müll. Zumal scheints kein fenster wirklich zu finden Sad Sondern nur zufällig irwelche werte wiederzugeben.

auch hier eine frage: Wie behandle ich die Returnwerte von dll funktionen?
Sämtliche tutorials und google ergebnisse ergaben nichts als fragen oder einfach garnichts.

-------

Ein paar seitenfragen, für gewillte poster:

Wie zur hölle kann ich 'per hand' in blitzmax einen 'LPCWSTR' erstellen?
Recherchen zu folge ist das ein Short[] wo ein zeichen mehr wie ein byte enthält / enthalten kann :S

Ich nutze momenten Varibale$z und Variable$w in den dll-parameter angaben, was auch (nach stunden des kopfzerbrechens) ganz gut funktioniert.
Aber was dahinter steht, konnte ich nicht rausfinden Sad

Und wie behandle ich Pointer? Kann ich einen String als einen WString pointer übergeben? Die dinger verwirren mich Very Happy Habe sie nie gebraucht :-/

Gruß, Phillipk Smile

Thunder

BeitragSo, Dez 05, 2010 23:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Einen LPCWSTR solltest du mit der Stringmethode toWString bekommen:
BlitzMax: [AUSKLAPPEN]
Local s$="Hallo",lpcwstr:Short Ptr=s.toWString()

Der Rückgabewert long in C/C++ steht für einen 32 Bit-Wert(!) d.h. in BlitzMax Int.
Deine zwei hervorgehobenen Fragen verstehe ich aber nicht ganz. Wie man eine DLL einbindet, kannst du hier lesen: https://www.blitzforum.de/foru...hp?t=11993

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

PhillipK

BeitragSo, Dez 05, 2010 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, ich habs in tausend (übertrieben gesagt) versuchen nicht geschafft, auch nur ein annähernd brauchbares ergebnis zu erzielen.

Frage 1 bezieht sich auf Pointer, genauer gesagt einen pointer, wo ein rückgabewert reingeschrieben werden soll.
Nach meinen recherchen frisst die dll LPCWSTR -> was .toWString() entspricht. Dieses wiederrum entspricht in blitzmax einem Short Ptr.

Sonstige beispiele haben pointer immer mit Varptr übergeben, aber einen Short ptr mit Varptr zu übertragen wäre doppelt gemoppelt. Und sämtliche tests schlugen fehl (einen string übergeben und $w als parameter zu fordern, einen string mit .toWString() zu konvertieren und diese variable (Short ptr) zu übertragen, selbst einen leeren shortarray anlegen und mit Varptr übergeben....) - ich bin mit meinem, recht kargen, latein am ende ^-^

Frage 2 bezieht sich auf die returnwerte. Nur leider kann ich nicht genau sagen, ob ich die returnwerte falsch behandle oder ob sie einfach nur vermurxxt sind, weil was anderes schiefläuft. Ich erhalte zb für den Windows-calc Fenster-positions-werte wie: X = 1270, Y = 1270, Breite= 14512, Höhe = 0...

Aufrufen und auswerten tue ich die funktionen mit
BlitzMax: [AUSKLAPPEN]
Global AU3_WinGetPosX:Int(sTitle$w, sText$w) "win32" = GetProcAddress(DLLHandle, "AU3_WinGetPosX")

Etc. Sad
Bei anderen funktionen, wo ich es einfacher überprüfen kann (ClipPut zb - packt einen string in den zwischenspeicher) hats wunderbar funktioniert.

Btw: Wenn ich dort, wo LPCWSTR gefordert war, etwas wie dies hier
BlitzMax: [AUSKLAPPEN]
Local s$="Hallo",lpcwstr:Short Ptr=s.toWString()

gemacht habe und dann lpcwstr übergeben hab, kam nur kuroiser krams raus.

Bei einem text wie "Hallo World" habe ich dann immer einen batzen chinesischer schriftzeichen in den zwischenspeicher bekommen Sad

Naja, entweder übersehe ich wichtige punkte oder ich verstehe was falsch, ODER die Dll ist sehr speziell wenns um blitzmax geht Smile

Gruß, Phillipk

BtbN

BeitragSo, Dez 05, 2010 23:51
Antworten mit Zitat
Benutzer-Profile anzeigen
LPCWSTR heisst, dass du den Speicher bereit machen sollst, und die Funktion dort einen String reinschreiben wird. Das geht mit einem BMax String nicht. musst also einen Short Ptr übergeben, der auf einen Speicher-Bereich zeigt(Dessen größe übrugens im zweiten parameter gefragt wird), und aus dem dann den String auslesen.
 

PhillipK

BeitragSo, Dez 05, 2010 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Jup, das mit der buffer len hab ich schon 'erlesen'

Komischerweise frage ich immer erst irwas, weil ich langsam verzweifel, und krieg dann doch irgendwie gute ergebnisse.

Ich habe es grade zumindest geschafft, den passenden rückgabewert zu erhalten. Die 2te frage fällt damit flach.

An der Pointerübergabe muss ich wohl noch feilen, bis ich das kapiert hab Sad

Edit:

Ack. ich habe mich mal wieder zum affen gemacht.
Eure beiden 'kleinen' hilfestellungen haben mir sehr geholfen oÔ einfach nur, weils klarheit in dem wirrwarr von informationen in meinem kopf gebracht hat.

Ich habe es nun anscheinend hinbekommen, die dll mit richtigen informationen zu füttern und richtige wieder rauszukriegen. Smile Ach über die pointer geschichte.

Nun muss ich nurnoch rausfinden, wie ich bei einem Short Ptr den ich übergeben muss, aber vorher nicht die größe der rückgabe weiß, die komischen leerzeichen abschneide Very Happy

Alles in allem.. ich glaube ich bin ein großes stück weiter ^-^

----

Edit2:

Tjo, das war wieder einfacher als erwartet. Dennoch find ich meinen Post gerechtfertigt - die geforderten informationen haben mich erschlagen & ich hab (für mich) nichts brauchbares aus google rausbekommen Sad

Die doofen leerzeichen hab ich übriegends mit String.fromShorts(Short ptr, Buffer_len) 'erhalten' wodurch mein string in meinem test immer 255 zeichen hatte.
String.fromWString(Short ptr) tut das gleiche, ist nur ohne 'leerstellen' Wink

Vielen dank für eure hilfe.. Ich war gestern echt am verzweifeln, da ichs einfach nicht gebacken bekommen hab Sad

Vielleicht hilft der thread ja dennoch dem ein oder anderen... Smile

Gruß, Phillipk

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group