Seite 1 von 1

Char Pointer in Funktionen von Fremd-DLL

Verfasst: 09.03.2005 17:14
von mannybass
Hi,
ich habe ein kleines Problem beim Zugriff auf Fremdbibliotheken: ich habe von einem Dritthersteller eine DLL, eine C-Header-Datei und eine Lib-Datei. Enthalten sind Funktionen wie z.B.:

int TMCOALA_EXP CoalaMakeTransportKey(
char ** rCertificate,
char ** rPrivateKey,
char * message,
int * messageLen,
const char * name,
const char * email,
const char * producerId,
const char * producerVersion,
const char * locality,
const char * country,
const char * jrePath,
const char * jarPath );

Ich brauche das, was von dieser Funktion in rCertificat und rPrivateKey geschrieben wird für andere Funktionen in dieser DLL.

Ich habe u.a. versucht, die Variablen mit

zertifikat.s = Space(2048)
pKey = Space(2048)
rcKey.l = 0

zu erstellen und so an die Funktion zu übergeben:

If OpenLibrary(0, "tmCOALA.dll")
...
rcKey = CallFunction(0, "CoalaMakeTransportKey", @zertifikat, @pKey, ...)

Die DLL konnte zwar geöffnet werden, aber beim Zugriff auf die Funktion stürzt mein Programm ab. Ich glaube, ich mache das mit den Char Pointern nicht richtig.

Kann mit da jemand einen Tipp geben?
Danke

Re: Char Pointer in Funktionen von Fremd-DLL

Verfasst: 09.03.2005 17:25
von Kiffi
> rcKey = CallFunction(0, "CoalaMakeTransportKey", @zertifikat, @pKey, ...)

Gibt denn IsFunction(0, "CoalaMakeTransportKey") einen Wert ungleich 0 zurück?

Grüße ... Kiffi

Verfasst: 09.03.2005 18:16
von mannybass
Danke für die schnelle Antwort, Kiffi.

Ja, der Rückgabewert ist ungleich 0.
Die Übergabe mit @zertifikat ist doch richtig, oder? Oder wäre es besser, einen Pointer zu übergeben, und den Wert dann mit PeekS(Pointer) auszulesen?
Diese Pointer-Sachen bereiten mir Kopfschmerzen.

Verfasst: 10.03.2005 05:56
von Laurin
Probiere mal statt @ ein * oder gar nichts vor die Variablen zu setzen. Vielleicht haut es ja dann hin.


Greetz Laurin

Verfasst: 10.03.2005 13:23
von Deeem2031
Laurin hat geschrieben:Probiere mal statt @ ein * oder gar nichts vor die Variablen zu setzen. Vielleicht haut es ja dann hin.


Greetz Laurin
Das dürfte nichts ändern, da bei Strings nur der Pointer übergeben werden kann, egal ob @, * oder nichts.

Ich würds aber mal mit CallCFunction(0, "CoalaMakeTransportKey", @zertifikat, @pKey, ...) versuchen ;)

Re: Char Pointer in Funktionen von Fremd-DLL

Verfasst: 10.03.2005 14:02
von Danilo
mannybass hat geschrieben:

Code: Alles auswählen

  char ** rCertificate,
  char ** rPrivateKey,
Das sind Pointer zu Pointer of Char, der Rest sind einfache
Pointer.
Du brauchst also die 2 Strings und dann 2 Pointer darauf,
von denen Du den Pointer übergibst.

Ungefähr so:

Code: Alles auswählen

zertifikat.s = Space(2048)
pKey.s = Space(2048)

rCertificate.l = @zertifikat ; String-Pointer in Variable
rPrivateKey.l = @pKey

; Aufruf:
rcKey = CallCFunction(0, "CoalaMakeTransportKey", @rCertificate, @rPrivateKey, message$, @messageLen, name$, email$, ...)
; (oder CallFunction)
'rCertificate.l = @zertifikat' ist der Pointer auf den String,
und '@rCertificate' somit der Pointer zu Pointer auf String.

Verfasst: 10.03.2005 16:39
von mannybass
Danke für die Hilfe, es klappt wunderbar.
Jetzt verstehe ich auch Pointer besser. Danke nochmal an alle.

Verfasst: 10.03.2005 23:50
von Deeem2031
Oder wenn man es etwas kürzer haben will:

Code: Alles auswählen

PokeL(@*zertifikat.STRING,Space(2048))
PokeL(@*pKey.STRING,Space(2048))

; Aufruf: 
rcKey = CallCFunction(0, "CoalaMakeTransportKey", @*zertifikat, @*pKey, message$, @messageLen, name$, email$, ...)
;)