Char Pointer in Funktionen von Fremd-DLL

Anfängerfragen zum Programmieren mit PureBasic.
mannybass
Beiträge: 12
Registriert: 14.10.2004 10:33

Char Pointer in Funktionen von Fremd-DLL

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Char Pointer in Funktionen von Fremd-DLL

Beitrag von Kiffi »

> rcKey = CallFunction(0, "CoalaMakeTransportKey", @zertifikat, @pKey, ...)

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

Grüße ... Kiffi
Hygge
mannybass
Beiträge: 12
Registriert: 14.10.2004 10:33

Beitrag 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.
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Probiere mal statt @ ein * oder gar nichts vor die Variablen zu setzen. Vielleicht haut es ja dann hin.


Greetz Laurin
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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 ;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Char Pointer in Funktionen von Fremd-DLL

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
mannybass
Beiträge: 12
Registriert: 14.10.2004 10:33

Beitrag von mannybass »

Danke für die Hilfe, es klappt wunderbar.
Jetzt verstehe ich auch Pointer besser. Danke nochmal an alle.
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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$, ...)
;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten