[TRIXI] Implementation PureBasic

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?

Gruß Helmut

Na, keinen Schlaf gefunden die Nacht? :smiley: 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)

Rückgabewerte sollten


1
0
0

lauten…

Toni

Hallo Toni,
kein Schlaf gefunden… oder : das muß doch gehen… kennst du das?

Bei der Funktion WriteString funktioniert es doch auch mit PansiChr ??
Da bekomme ich doch auch was >0?

Ich probiere heute Abend noch was, deine Tips hatte ich schon versucht.

Gruß Helmut
PS. Das mit Purebasic darf keiner wissen, sonst schmeißen alle ihre Compiler weg! Psssst

Klar… wer, aus der IT-Branche, kennt das nicht? :wink:

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“. :wink:

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]

Toni

Nun nimmst du mir auch noch die Illusion mit WriteString…

Probiere heute abend noch ein wenig.

Gruß Helmut

hier hat einer ein ähnliches Problem: (Klick)

demnach könnte auch sowas der richtige Weg sein:


OpenLibrary(255, "TRIXI.dll")
*connect= IsFunction(255, "Connect")
CallFunctionFast(*connect, "127.0.0.1", 3773) 


; Am Programmende wird TRIXI wieder freigegeben
CloseLibrary(255)  

BTW: Ich rate nur… Aber PAnsiChar und PChar unter FPC ist das selbe. Könnte also passen.

Toni

Die Funktion ist nicht mehr möglich,
ich verdaddel schon wieder meine Zeit…

Ich verspreche mir mehr von DIESER FUNKTION

Gruß Helmut

Also ich gebe auf,
die Debug ausgabe bringt den String, in der Kommandozeile wird es abgewiesen.

Hab’ schon alles probiert…

Gruß Helmut

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.

Toni

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

Habe einen entprechenden Tread im Purebasic-Anfänger-Forum erstellt.
Auch da ist man immer bereit zu helfen.
Mein HID_Funk_Schaltuhrenprogramm ist auch mit Deren Hilfe über Timertreads was geworden!

Gruß Helmut

Toni hat die IP Adressenübergabe hinbekommen.

Was ich noch nicht verstanden habe, ist das mit den Double und Gleitkommazahlen.

Da muß wohl 'ne Übersetzung her, davon verstehe ich noch nichts…

Alles andere funktionoggelt, hier ein PureBasic-BeispielCode:

;function Connect(Server: PAnsiChar; Port: Integer): Boolean;
Prototype.l ProtoConnect(Server.p-ascii, Port.i)

iLib=OpenLibrary(#PB_Any,"I:\PureBasic450_x86\Helmut\Trixi.dll")

If iLib
  Trixi_Connect.ProtoConnect = GetFunction(iLIB,"Connect")  
  Text.s = "127.0.0.1" : Port.i = 3773
  RetVal = Trixi_Connect(Text, Port)
  If RetVal
    Debug retVal
    Debug "Verbunden"
  Else
    Debug "Nicht Verbunden"
  EndIf
  
;function WriteString(Variable: Integer; Value: PAnsiChar):
VariablenNr.i=58976
ValueStr.s="Helmut's Purebasic"

RetVal_Write_Str.l=CallFunction(iLIB,"WriteString", VariablenNr, @ValueStr)

Debug VariablenNr

Debug RetVal_Write_Str

;function WriteInteger(Variable: Integer; Value: Integer): Integer; stdcall external 'TRIXI.DLL';
VariablenNr.i=22023
Value_Int.i=112
RetVal_Write_Integer=CallFunction(iLIB,"WriteInteger",VariablenNr,Value_int)

Debug RetVal_Write_Integer

VariablenNr.i=12269
Value_Boolean.i=1

RetVal_Write_Boolean=CallFunction(iLIB,"WriteBoolean",VariablenNr,Value_Boolean)

Debug RetVal_Write_Boolean

VariablenNr.i=56147
RetVal_Read_Float=CallFunction(iLIB,"ReadFloat",VariablenNr)

Debug RetVal_Read_Float ; Da kommt 'ne Double Zahl raus, die Umrechnung in Gleitkommazahl ist  ????

VariablenNr.i=52671
RetVal_Read_Boolean=CallFunction(iLIB,"ReadBoolean",VariablenNr)

Debug RetVal_Read_Boolean

VariablenNr.i=16474
RetVal_Run_Script=CallFunction(iLIB,"RunScript",VariablenNr)

Debug RetVal_RunScript



VariablenNr.i=56003
; hier wird wahrscheinlich eine Umrechnung in Double nötig sei, WIE ??  Keine Ahnung..
Value_Float.d=0.1
; Nachfolgend gibt es eine Prgrammfehler ....
;RetVal_Write_Float=CallFunction(iLIB,"WriteFloat",VariablenNr,Value_Float)

;Debug RetVal_Write_Float
  
  CloseLibrary(iLib)
  
EndIf
;                               Erklärung: Teile in -> http://127.0.0.1:3773/
;................(................................) Rückgabewert
;function Connect(Server: PAnsiChar; Port: Integer): Boolean; stdcall external 'TRIXI.DLL';
;function Disconnect(): Boolean; stdcall external 'TRIXI.DLL';
;function IsOnline(): Boolean; stdcall external 'TRIXI.DLL';
;function WriteString(Variable: Integer; Value: PAnsiChar): Integer; stdcall external 'TRIXI.DLL';
;function WriteInteger(Variable: Integer; Value: Integer): Integer; stdcall external 'TRIXI.DLL';
;function WriteFloat(Variable: Integer; Value: Double): Integer; stdcall external 'TRIXI.DLL';
;function WriteBoolean(Variable: Integer; Value: Boolean): Integer; stdcall external 'TRIXI.DLL';
;function ReadString(Variable: Integer): PAnsiChar; stdcall external 'TRIXI.DLL';
;function ReadInteger(Variable: Integer): Integer; stdcall external 'TRIXI.DLL';
;function ReadFloat(Variable: Integer): Double; stdcall external 'TRIXI.DLL';
;function ReadBoolean(Variable: Integer): Boolean; stdcall external 'TRIXI.DLL';
;function RunScript(Variable: Integer): Integer; stdcall external 'TRIXI.DLL';



Gruß Helmut

Super… Dann werde ich die Änderung für die Version 0.13 übernehmen. Das dauert aber noch eine kleine Weile. :wink:

Den Durchbruch brachte AutoIt und das Script von Anti.

Gruß,

Toni

@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.

Code müßte mit der Demo funktionieren.

;function Connect(Server: PAnsiChar; Port: Integer): Boolean;
Prototype.l ProtoConnect(Server.p-ascii, Port.i)

iLib=OpenLibrary(#PB_Any,"Dein Pfad\Trixi.dll")

If iLib
  Trixi_Connect.ProtoConnect = GetFunction(iLIB,"Connect")  
  Text.s = "127.0.0.1" : Port.i = 3773
  RetVal = Trixi_Connect(Text, Port)
  If RetVal
    Debug retVal
    Debug "Verbunden"
  Else
    Debug "Nicht Verbunden"
  EndIf
  
;function WriteString(Variable: Integer; Value: PAnsiChar):
VariablenNr.i=58976
ValueStr.s="Helmut's Purebasic"

RetVal_Write_Str.l=CallFunction(iLIB,"WriteString", VariablenNr, @ValueStr)

Debug VariablenNr

Debug RetVal_Write_Str

;function WriteInteger(Variable: Integer; Value: Integer): Integer; stdcall external 'TRIXI.DLL';
VariablenNr.i=22023
Value_Int.i=112
RetVal_Write_Integer=CallFunction(iLIB,"WriteInteger",VariablenNr,Value_int)

Debug RetVal_Write_Integer

VariablenNr.i=12269
Value_Boolean.i=1

RetVal_Write_Boolean=CallFunction(iLIB,"WriteBoolean",VariablenNr,Value_Boolean)

Debug RetVal_Write_Boolean

VariablenNr.i=56147
RetVal_Read_Float=CallFunction(iLIB,"ReadFloat",VariablenNr)

Debug RetVal_Read_Float ; Da kommt ne Double Zahl raus, die Umrechnung in Gleitkommazahl ist  ????

VariablenNr.i=18629
RetVal_ReadBoolean=CallFunction(iLIB,"ReadBoolean",VariablenNr)

Debug RetVal_ReadBoolean

VariablenNr.i=58976

RetVal_ReadString=CallFunction(iLIB,"ReadString",VariablenNr)

Debug RetVal_ReadString


VariablenNr.i=16474
RetVal_Run_Script=CallFunction(iLIB,"RunScript",VariablenNr)

Debug RetVal_RunScript



VariablenNr.i=56003
; hier wird wahrscheinlich eine Umrechnung in Double nötig sei, WIE ??  Keine Ahnung..
Value_Float.d=0.1
; Nachfolgend gibt es eine Prgrammfehler ....
;RetVal_Write_Float=CallFunction(iLIB,"WriteFloat",VariablenNr,Value_Float)

;Debug RetVal_Write_Float
  
  CloseLibrary(iLib)
  
EndIf
;                               Erklärung: Teile in -> http://127.0.0.1:3773/
;................(................................) Rückgabewert
;function Connect(Server: PAnsiChar; Port: Integer): Boolean; stdcall external 'TRIXI.DLL';
;function Disconnect(): Boolean; stdcall external 'TRIXI.DLL';
;function IsOnline(): Boolean; stdcall external 'TRIXI.DLL';
;function WriteString(Variable: Integer; Value: PAnsiChar): Integer; stdcall external 'TRIXI.DLL';
;function WriteInteger(Variable: Integer; Value: Integer): Integer; stdcall external 'TRIXI.DLL';
;function WriteFloat(Variable: Integer; Value: Double): Integer; stdcall external 'TRIXI.DLL';
;function WriteBoolean(Variable: Integer; Value: Boolean): Integer; stdcall external 'TRIXI.DLL';
;function ReadString(Variable: Integer): PAnsiChar; stdcall external 'TRIXI.DLL';
;function ReadInteger(Variable: Integer): Integer; stdcall external 'TRIXI.DLL';
;function ReadFloat(Variable: Integer): Double; stdcall external 'TRIXI.DLL';
;function ReadBoolean(Variable: Integer): Boolean; stdcall external 'TRIXI.DLL';
;function RunScript(Variable: Integer): Integer; stdcall external 'TRIXI.DLL';


Gruß Helmut

Ich hab keine Ahnung von PureBasic und das auch nicht mehr installiert.

Aber wenn dein prototype (Zeile 2) funktioniert, warum wechselst du dann deine Strategie?

Toni

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:

;function ReadBoolean(Variable: Integer): Boolean; stdcall external 'TRIXI.DLL'; 

Bei den (Read) Lib-Befehlen ist der Rückgabewert nach der Klammer und dem Dopplepunkt beschrieben.

;function ReadString(Variable: Integer): PAnsiChar; stdcall external 'TRIXI.DLL'; 

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.

Gruß Helmut

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.

Gruß,

Toni

Deswegen wird es immernoch kein String…hatte ich ja schon geschrieben: schon probiert gleiche Fehlermeldung:

;function Connect(Server: PAnsiChar; Port: Integer): Boolean;
Prototype.l ProtoConnect(Server.p-ascii, Port.i)

Prototype.i ProtoReadString(Variable.i) ;                           Made for Toni 

iLib=OpenLibrary(#PB_Any,"I:\PureBasic450_x86\Helmut\Trixi.dll")

If iLib
  Trixi_Connect.ProtoConnect = GetFunction(iLIB,"Connect")

Trixi_ReadString.ProtoReadString = GetFunction(iLIB,"ReadString") ; Made for Toni ;-) 

  Text.s = "127.0.0.1" : Port.i = 3773
  RetVal = Trixi_Connect(Text, Port)
  If RetVal
    Debug retVal
    Debug "Verbunden"
  Else
    Debug "Nicht Verbunden"
  EndIf
  
;function WriteString(Variable: Integer; Value: PAnsiChar):
VariablenNr.i=58976
ValueStr.s="Helmut's Purebasic"

RetVal_Write_Str.l=CallFunction(iLIB,"WriteString", VariablenNr, @ValueStr)

Debug VariablenNr

Debug RetVal_Write_Str

;function WriteInteger(Variable: Integer; Value: Integer): Integer; stdcall external 'TRIXI.DLL';
VariablenNr.i=22023
Value_Int.i=112
RetVal_Write_Integer=CallFunction(iLIB,"WriteInteger",VariablenNr,Value_int)

Debug RetVal_Write_Integer

VariablenNr.i=12269
Value_Boolean.i=1

RetVal_Write_Boolean=CallFunction(iLIB,"WriteBoolean",VariablenNr,Value_Boolean)

Debug RetVal_Write_Boolean

VariablenNr.i=56147
RetVal_Read_Float=CallFunction(iLIB,"ReadFloat",VariablenNr)

Debug RetVal_Read_Float ; Da kommt ne Double Zahl raus, die Umrechnung in Gleitkommazahl ist  ????

VariablenNr.i=18629
RetVal_ReadBoolean=CallFunction(iLIB,"ReadBoolean",VariablenNr)

Debug RetVal_ReadBoolean

;Prototype.i ReadInteger(Variable.i)  

;Prototype.i ReadString(Variable.i)  
 

VariablenNr.i=58976

RetVal_ReadString.s = Trixi_ReadString(VariablenNr) ; laut Toni eine Möglichkeit! Geht aber auch nicht...Wird kein String

;RetVal_ReadString.s=GetFunction(iLIB,"ReadString",VariablenNr)
Debug "read string"
Debug RetVal_ReadString


VariablenNr.i=16474
RetVal_Run_Script=CallFunction(iLIB,"RunScript",VariablenNr)

Debug RetVal_RunScript



VariablenNr.i=56003
; hier wird wahrscheinlich eine Umrechnung in Double nötig sei, WIE ??  Keine Ahnung..
Value_Float.d=0.1
; Nachfolgend gibt es eine Prgrammfehler ....
;RetVal_Write_Float=CallFunction(iLIB,"WriteFloat",VariablenNr,Value_Float)

;Debug RetVal_Write_Float
  
  CloseLibrary(iLib)
  
EndIf
;                               Erklärung: Teile in -> http://127.0.0.1:3773/
;................(................................) Rückgabewert
;function Connect(Server: PAnsiChar; Port: Integer): Boolean; stdcall external 'TRIXI.DLL';
;function Disconnect(): Boolean; stdcall external 'TRIXI.DLL';
;function IsOnline(): Boolean; stdcall external 'TRIXI.DLL';
;function WriteString(Variable: Integer; Value: PAnsiChar): Integer; stdcall external 'TRIXI.DLL';
;function WriteInteger(Variable: Integer; Value: Integer): Integer; stdcall external 'TRIXI.DLL';
;function WriteFloat(Variable: Integer; Value: Double): Integer; stdcall external 'TRIXI.DLL';
;function WriteBoolean(Variable: Integer; Value: Boolean): Integer; stdcall external 'TRIXI.DLL';
;function ReadString(Variable: Integer): PAnsiChar; stdcall external 'TRIXI.DLL';
;function ReadInteger(Variable: Integer): Integer; stdcall external 'TRIXI.DLL';
;function ReadFloat(Variable: Integer): Double; stdcall external 'TRIXI.DLL';
;function ReadBoolean(Variable: Integer): Boolean; stdcall external 'TRIXI.DLL';
;function RunScript(Variable: Integer): Integer; stdcall external 'TRIXI.DLL';



Gruß Helmut

Edit: Boolean habe ich durch das Beschreiben der BooleanVariable über IPS-Debug und dem Lesen über Purebasic
Mit Testwerten ausprobiert.

Prototype.i steht für Integer? Kann das sein? Wie soll das denn auch funktionieren? Klar meckert er dich dann an. Und das mit Recht.

Mach Strings mal als letztes. Die sind am schwierigsten.

Mein Gott bist du schnell: geändert in .s

Dann ändert sich die Fehlermeldung in Bild::rolleyes:

Teste heute Abend weiter…

Gruß Helmut

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. :wink:

Toni