für alle die es interessiert:
wenn schon Parameter als "char" erwartet werden sollte
man wenn variablen auch solche übergeben.
das heißt es müssen dann variablen vom Typ
eines nullterminierten Strings übergeben werden.
Sprachenübergreifend funktioniert die Übergabe von Strings
oder anderen Klassen nicht.
Dies gilt auch für DLLs und alle anderen Programmiersprachen.
VB Spezifisch:
Variablen mit "ByVal" übergeben
Sie müssen immer das Schlüsselwort "ByVal" in der Deklaration angeben, obwohl Zeichenketten als Referenzparameter übergeben werden. Das liegt daran, dass Zeichenketten bei API-Funktionen intern als Zeiger behandelt werden. Normalerweise müssen Sie sich nicht um Zeiger kümmern. Doch eine Reihe von API-Funktionen (zum Beispiel "WriteProfileString" oder "GetProfileString") verhalten sich anders, wenn Sie ihnen einen Null-Zeiger übergeben. Einen Null-Zeiger können Sie ganz einfach an Windows übergeben: Sie benutzen wieder die vordefinierte Konstante vbNullString. Diese Konstante übergibt nicht einfach eine leere Zeichenkette an die Funktion, sondern einen "leeren" Zeiger, der auch als Long-Wert 0 ausgedrückt werden könnte. Ein solcher Null-Zeiger enthält keine Daten, das heißt er zeigt auf nichts und weist Windows an, das entsprechende Argument zu ignorieren.
Die Größe des reservierten Speichers
Sie benötigen zusätzlich eine Angabe über die Größe des reservierten Speicherbereichs. Der Puffer muss so groß sein, wie die Größenangabe vorsieht. Aus diesem Grunde sollten Sie mit Hilfe der Funktion String$() eine Zeichenkette in der richtigen Größe erzeugen und – sehr wichtig! – mit Null-Zeichen füllen. Wenn die von der Funktion erzeugte Zeichenkette länger ist, werden nur die Zeichen im Puffer abgelegt, die auch hineinpassen. Das Prinzip eines Aufrufes dieser Art sieht in Basic so aus:
sLen = 30
Buffer = String$(sLen, 0)
Result = TheAPIFunction(Buffer, sLen)
Null-terminierte String verwenden
Windows erwartet keine Basic-Strings, sondern nullterminierte Strings (siehe vorhergehende Seite "Handles, Zeiger und Null-Strings"). Der Vorteil dabei ist die Flexibilität: Dank der Speicherverwaltung von Windows können nullterminierte Strings im Prinzip beliebig lang werden. Leider verwaltet Visual Basic Strings intern vollkommen anders. In einigen Fällen können Sie VB-Strings analog zu nullterminierten Strings nutzen. Doch meistens müssen Sie Vorbereitungen treffen und zum Beispiel den String mit Null-Zeichen initialisieren oder mit vbNullChar explizit ein Null-Zeichen an seinem Ende anfügen:
VBStr = "Hallo Windows!"
WinStr = VbStr + vbNullChar
in Delphi übergibt man z.B den Typ PChar.
Gruß
Andreas
------------------
Nobody is perfect
[Diese Nachricht wurde von Andreas2DEasy am 24. Feb. 2006 editiert.]
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP