Ich bin mit dem Einbinden (bei den HID-Geräten) von DLL’s in Purebasic nur über Try and Error fertig geworden.
Habe es auch mal mit trixi versucht:
Die Connect Geschichte wird nicht richtig gemacht und gibt 0 wieder.
Was kann da falsch sein: die String-Zeichencodierung?
Na, keinen Schlaf gefunden die Nacht? Junge, junge… PureBasic höre ich zum ersten mal…
Ja, das wird so sein. PAnsiChar ist ein Pointer auf ein Ansi CharArray (String). Wobei Ansi normalerweise der Standard ist und nur aussagt, dass es eben nicht Unicode sein soll was da übergeben wird. Der Zweite Parameter ist kein Pointer sondern eine ganz normaler Integer.
Gefühlsmäßig müsste das so klappen (hab keinen blassen Schimmer von PureBasic):
CallFunction(iLIB, "Connect", @IPAdresse.s, PortNr.i)
# oder vielleicht auch so
CallFunction(iLIB, "Connect", @IPAdresse, PortNr)
Connect gibt ein Boolean zurück während WriteString ein Integer zurück gibt. 0 bedeutet bei Connect „False“ - Also „Not Connected“. Während 102 ein Fehlercode ist und bedeutet „Not Connectet“.
In der Doku würde man das dann natürlich auch nachlesen können sobald sie fertig ist.
[Edit]
In diesem Tutorial wird das arbeiten mit Pointern unter PureBasic erläutert. Vielleicht musst du die Länge des Strings, also deiner IP manuell mal auf 255 setzen um Speicher zu allozieren. Ich würde aber auch probieren deine IP Adress mal numerisch zu übergeben.Hast du mal versucht ob eine der EXEn aus der Demo mit ‚lcalhost‘ bei dir funktioniert? Und dann würd ich die Länge mal auf 9 setzten und die IP „127.0.0.1“ (9 Zeichen) verwenden. Öhm… was könnte noch ein Stolperstein sein? [/Edit]
Tja… Ich kenn PureBasic leider garnicht. Mein Tip: Frag in nem PureBasic Forum und erwähne, dass LPCSTR an die Stelle gehört. Das ist kein Woodoo sondern Windows Standard. Das kennen die bestimmt.
Habe es mal mit den Purebasic-Network-Befehlen versucht.
Da läuft es mit der Verbindung zu IPSymcon.
;
; ------------------------------------------------------------
;
; PureBasic - Network (Client) example file
;
; (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Port = 3774 ;6832
ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
MessageRequester("PureBasic - Client", "Client connected to server...", 0)
SendNetworkString(ConnectionID, "An hello from a client !!! :-)")
MessageRequester("PureBasic - Client", "A string has been sent to the server, please check it before quit...", 0)
CloseNetworkConnection(ConnectionID)
Else
MessageRequester("PureBasic - Client", "Can't find the server (Is it launched ?).", 0)
EndIf
End
@Toni
kannst du mir mal bei den Rückgabewerten helfen?
String, Integer, Float.
Boolean ist ok, bei den oben genannten gibt es Ziffern, zB. eine Stringvariable kann ich nicht als Rückgabe bekommen.
Hallo Toni,
programmieren ist auch eher Hobby, vielleicht bin ich kein Stratege?
Zeile 2 verhilft mir zum Öffnen, danach ist sie offen und ich kann die Lib-Befehle nutzen.
Für jeden Lib-Befehl Prototype zu nutzen habe ich auch schon probiert, hilft nicht, ist auch scheinbar nicht nötig: alle Schreibbefehle gehen ja auch, der ReadBooleanbefehl gibt auch was Richtiges wieder.
Das Problem sind die Rückgabewerte.
Bei Boolean bekomme ich richtige Werte zurück:
Bei dem ReadString Befehl bekomme ich keinen String zurück…oder ich kann es nicht deuten, jedenfalls werden alle Stringvariablen mit (kann keinen numerischen Wert in eine Stringvariable schreiben) bemeckert.
Zeile 2 verhilft mir zum Öffnen, danach ist sie offen
Nein, Zeile 2 ist die PureBasic Übersetzung für Zeile 1. Zeile 1 wiedrum ist aus der TRIXI Demo und soll dir zeigen wie es geht. Sie Öffnet nicht die DLL sondern benutzt die Funktion Connect aus der DLL, bzw bereitet die Benutzung vor. Wenn du eine andere Funktion auch benutzen willst würde ich vorschlagen die Benutzung auch so zu vorzubereiten. Klingt doch plausibel, oder?
Es gibt immer mehrere Wege, die zum Ziel führen. Aber findest du es nicht auch sinnvoll den Weg zu wählen für den du schon eine Karte hast?
Bei den (Read) Lib-Befehlen ist der Rückgabewert nach der Klammer und dem Dopplepunkt beschrieben.
Und bei Connect steht er in PB vorne.
Prototype.l ProtoConnect(Server.p-ascii, Port.i)
Ich tippe also auf:
Prototype.i ProtoReadInteger(Variable.i)
Nur ein Schuss ins Blaue…
Edit:
Und lass dich nicht verwirren dadurch dass Boolean offenbar geht. Im Speicher sind nur Einsen und Nullen gespeichert. Einsen und Nullen ergeben Zahlen, Zahlen ergeben Buchstaben oder andere Zahlen/Darstellungen. Alle Zahlen ungleich Null sind True. „Helmut“ ist also gleichbedeutend mit „48 65 6C 6D 75 74“ und damit ungleich „00 00 00 00 00 00“ und damit True. „Server not Found“ oder 42 sind ebenfalls True. Das bedeutet garnichts.
Könnt sein, wenn du sonst an alles gedacht hast, dass du einen Pointer auf einen Nullterminierten String (die Geschichte mit dem LPCSTR) bekommst. Stell das zurück. Versuch Integer. Das ist wirklich einfacher. Wenn wir wissen wie das geht machen wir Schritt 2. Nicht andersrum.