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
Stringkonvertierung
Moderator: Moderatoren
- Jan
- Marvin
- Beiträge: 14651
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Stringkonvertierung
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Stringkonvertierung
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.
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.
Gruß
Hubert
Hubert
- Jan
- Marvin
- Beiträge: 14651
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Stringkonvertierung
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
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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2513
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Stringkonvertierung
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.)
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.)
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Jan
- Marvin
- Beiträge: 14651
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Stringkonvertierung
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
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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- HaPe
- 1000 working lines a day
- Beiträge: 996
- Registriert: So, 15. Nov 2015 17:44
- Wohnort: 71665 Vaihingen-Enz
- Hat sich bedankt: 17 Mal
- Danksagung erhalten: 15 Mal
Re: Stringkonvertierung
Hallo Jan !
Schreib doch mal den Bitmapstring in ein Array, also jedes Zeichen in ein Array-Element.
Versuch macht klug
Schreib doch mal den Bitmapstring in ein Array, also jedes Zeichen in ein Array-Element.
Versuch macht klug
--
Hans-Peter
Hans-Peter
- brandelh
- Foren-Moderator
- Beiträge: 15695
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Stringkonvertierung
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.
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.
Gruß
Hubert
Hubert