Seite 1 von 1

Stringkonvertierung

Verfasst: Fr, 30. Jul 2021 23:39
von Jan
Hallo,

da merke ich mal wieder das mit das Fundament fehlt. Ich muß einen String als Parameter an eine externe dll übergeben. Dummerweise hat dieser String Nullbytes drin. Womit das an diesen Positionen scheitert. Jetzt habe ich den Hinweis bekommen das ich nicht den String übergeben darf, sondern das als "block of bytes" machen muß, um die Nullbytes mit rüber zu bekommen. In der dll-Hilfe heißt es ganz banal nur, das müsse ein ANSIString sein.

Was wäre da jetzt die richtige Konvertierungsfunktion?

Jan

Re: Stringkonvertierung

Verfasst: Sa, 31. Jul 2021 8:54
von brandelh
Ich weiß ja nichts über deine DLL Funktion, aber ein String wird an DLLs als Pointer auf die Daten übergeben, das macht DLLCALL automatisch.
Viele Sprachen nutzen aber ASCIIZ Strings und dann ist das chr(0) Zeichen, die End Of String Markierung, du musst also eher bei den Parametern der DLL etwas einstellen.

API Funktionen z.B. haben häufig eine Längenangabe der übergebenden Daten dabei, wenn man die setzt werden auch chr(0) eingelesen, wenn nicht wird das als Ende der Daten interpretiert.

Xbase++ selbst (ist ja in C geschrieben) kann nur chr(0) im String enthalten und verarbeiten, weil es intern Strings als Array of Bytes ansieht.

Re: Stringkonvertierung

Verfasst: Sa, 31. Jul 2021 9:46
von Jan
Hallo Hubert,

Danke für die Antwort. Ich steh bei solchen Fragen echt auf dem Schlauch, für mich ist das immer ein Buch mit viel mehr als nur sieben Siegeln.

Der DLLCALL hat als zweiten Parameter ein DLL_CDECL stehen. Was mit allen anderen Fuktionsaufrufen in diese dll auch super funktioniert. Nur hier nicht.

Der betreffende String ist übrigens eine JPG oder BMP.

Jan

Re: Stringkonvertierung

Verfasst: Sa, 31. Jul 2021 12:38
von ramses
Hallo Jan
bist du dir wirklich sicher dass du den Bildinhalt selbst und nicht nur den Filenamen als Ansi-String übergeben musst?
(Den Bildinhalt kannst du nicht als Ansi String formatieren.)

Re: Stringkonvertierung

Verfasst: Sa, 31. Jul 2021 12:52
von Jan
Carlo,

ja. Es gibt in diesem Fall überhaupt keine Datei. Und die Funktion, der ich den Dateinamen übergeben müsste, heißt anders. Und funktioniert auch.

Jan

Re: Stringkonvertierung

Verfasst: Sa, 31. Jul 2021 14:18
von HaPe
Hallo Jan !

Schreib doch mal den Bitmapstring in ein Array, also jedes Zeichen in ein Array-Element.
Versuch macht klug :wink:

Re: Stringkonvertierung

Verfasst: Sa, 31. Jul 2021 18:33
von brandelh
Ein Xbase String ist schon das was Jan braucht, wenn man z.B. eine BMP direkt in eine Variable lädt,
ist das technisch ein Bytearray (ich meine der Begriff kommt von C die ja keine chr(0) in Strings haben dürfen), aber eben kein Xbase++ Array, das würde nicht funktionieren.

Im PowerBasic übergibt man hier einen Pointer (also LONG), aber nicht auf die Stringvariable, sondern auf den String selbst.

Die Angabe der DLL_CDECL ist vermutlich richtig bei der QuickPDF, da es eine C Bibliothek ist,
Ich selbst nutze ja OT4XB, das kümmert sich selbst um die Aufrufkonvention.
Sicher ist aber, dass diese je DLL immer gleich ist, es geregelt ja die Reihenfolge in der die Parameter intern übergeben werden (die einen von links nach rechts, die andere von rechts nach links).

Tipp, wenn es nicht direkt funktioniert, kannst du die BMP auch mit temporärem Namen speichern und die AddImageFromFile nutzen.