[TRIXI] Implementation AutoIt

Ich supporte nicht per PM - Jeder sollte von euren Lösungen profitiren können!

Hier die funktionierende Lösung zu AutoIt3 aus diesem Thread:


$id = 53246
$result2 ="##";
$TrixiDLL = DllOpen("trixi.dll")
DllCall($TrixiDLL,"none","WriteDebugFile", "str", "test.txt", "int", 1)
ConsoleWrite ($TrixiDLL & @crlf)
$result = DllCall($TrixiDLL, "int", "Connect", "str", "127.0.0.1", "int", 3773)
If @error = 0 Then ConsoleWrite ("+")
If @error = 1 Then MsgBox(0,"ERROR","Unable to use the DLL file.")
If @error = 2 Then MsgBox(0,"ERROR","Unknown return type.")
If @error = 3 Then MsgBox(0,"ERROR","Function not found in the DLL file.")
ConsoleWrite ("->>>" & $result & "<-:" & $result2)
$result2 = DllCall($TrixiDLL, "str", "ReadString", "int", $id)
If @error = 0 Then ConsoleWrite ("+")
If @error = 1 Then MsgBox(0,"ERROR","Unable to use the DLL file.")
If @error = 2 Then MsgBox(0,"ERROR","Unknown return type.")
If @error = 3 Then MsgBox(0,"ERROR","Function not found in the DLL file.")
ConsoleWrite ("->>>" & $result & "<-:" & $result2)
$result2 = DllCall($TrixiDLL, "int", "WriteString", "int", $id, "str", "Test Test")
If @error = 0 Then ConsoleWrite ("*")
If @error = 1 Then MsgBox(0,"ERROR","Unable to use the DLL file.")
If @error = 2 Then MsgBox(0,"ERROR","Unknown return type.")
If @error = 3 Then MsgBox(0,"ERROR","Function not found in the DLL file.")

DllClose($TrixiDLL)

Vielen Dank, Anti.

Errorhandling kann hier theoretisch raus geschmissen werden.

Moin Anti…

Wie du in den Demos nachschauen kannst ist stdcall auf jeden Fall schon mal das Mittel der Wahl.

Versuch doch mal ein Debugfile zu erzeugen.

Nachzulesen in der Demo im Ordner TRIXIpro.


procedure WriteDebugFile(FilePath: PAnsiChar; MsgSink: Boolean); stdcall external 'TRIXI.DLL';

procedure TForm1.FormCreate(Sender: TObject);
begin
  WriteDebugFile(PAnsiChar('TRIXI.log'), true);
end;

Gruß,

Toni

Will ich das nacher mal versuchen.

Achja befor ich weiter rumtrickse … habe gelesen:
„Es ist nicht möglich, eine .NET basierende DLL zu verwenden.“
Grosse Frage … ist Trixi .NET basierend? Vermutlich, oder?

Anti

Nö… Solides Win32 Kompilat :D. Darum gehts ja, dass es zu fast Allem kompatibel ist.

Benötigt allerdings Multithreading was mache Aufrufumgebungen offenbar nicht unterstützen. Hab mich ein Konzept überlegt wie ich das umgehen kann. Aber „TRIXI-Light“ ist bisher nicht mehr als ein Konzept…

Toni

Jau der Tipp war klasse.

20.10.2010 12:38:59 — DebugFile enabled.
20.10.2010 12:38:59 — Messagesink will be written to logfile too.
20.10.2010 12:38:59 — Server settings: 127.0.0.1:3773
20.10.2010 12:38:59 — Try to connect to IPS -> Offline
20.10.2010 12:38:59 — ReadString Variable ID: 16262, Value: „“ -> Offline
20.10.2010 12:38:59 — WriteString Variable ID: 16262, Value: „Test Test“ -> Offline

Mit deinem Testprogramm geht der connect, hier sagt er off :frowning:

könnte das selbe Problem sein wie (vermutlich) bei purebasic. Aber mit AutoIt und deinem Script könnt ich an TRIXI-Light tüfteln.

Jops Autoit ist nicht schlecht und kostenlos. Lad dir den passen Skythe Editor mit runter, wenn du das angehst.

Ich hab einfach noch:
DllCall($TrixiDLL,„none“,„WriteDebugFile“, „str“, „test.txt“, „int“, 1)
nach dem DLLOPEN eingebaut.

Anti

Wenn du Bock hast, kümmere ich mich diese Woche noch um eine Test-Dll für dich. Wenn der Test klappt, muss ich noch schauen wie ich das mach, dann bekommste ne DLL speziell ohne MT.

Toni

Yes! Das hat mir gefehlt. Ein einfaches, fertiges Script und eine Entwicklungsumgebung die ich „out of the box“ bedienen kann ohne dass ich erst stundenlang Manuals lesen muss.

Die Änderungen der Vorabversion, die ich dir geschickt hab, fließen dann in die Version 0.13 ein. Daeuert aber noch ne Weile…

Gruß,

Toni

:o Ich bin unwürdig :o

Funktioniert scheinbar. Mach dir aber nicht zuviel Mühe damit, derzeit wollte ich das nur mal testen, da ich ja immer noch produktiv auf V1 bin. Allerdings wollte ich in der näheren Zukunft das mal neu aufsetzen, da ich sowieso umziehe … :slight_smile:

Von daher schon mal ein bischen die Möglichkeiten ausloten :slight_smile:

Anti

So wie es ausschaut war das der manchmal notwendige Initialfunke damit es auch mit PureBasic (siehe anderer Thread) und vermutlich auch mit CodeBlocks (C++ IDE) klappt. Es war also grundlegend was nicht ganz rund in der DLL. AutoIt war nur der passende Hebel zu dem Problem, bzw der Lichtschalter in meinem kranken Brain. Muhuhuhahahaha

Toni

Hallo,

ich versuche ebenfalls mit autoIT auf IP-Symcon zuzugreifen.
Ich habe mal den Code aus dem 1. Post ergänzt um den „DLLCall“ versucht.

Leider bekomme ich in der erstellten txt Fehler angezeigt.

------------------------------------------------------
03.11.2010 21:19:55 --- DebugFile enabled.
03.11.2010 21:19:55 --- Messagesink will be written to logfile too.
03.11.2010 21:19:55 --- Server settings: ¨"W:9237784 - Pinging...
03.11.2010 21:20:03 --- Ping failed. Aborting.
03.11.2010 21:20:03 --- ReadString Variable ID: 51114, Value: "" -> Offline
03.11.2010 21:20:03 --- WriteString Variable ID: 51114, Value: "Test Test" -> Offline

Er kann die von mir eingegebene IP Adresse gar nicht korrekt wiedergeben.
Die mit der trixi.dll ausgelieferte Demo funktioniert. Ich habe als dll die Version 0.13.1.0 im Einsatz.

Könnte mir jemand helfen, dieses Problem zu lösen. ich weiss ehrlich gesagt nicht, wo ich ansetzen soll.

Danke und Gruß
Christian

Machs einfach so wie anti… Das script ist doch fertig.

Edit:

Kleinen Fehler im geposteten Ur-Script (1. Beitrag) gefunden und korrigiert. Unnötiges Zeug entfernt

Gruß,

Toni

Hallo Toni,

danke für die Korrektur. Jetzt geht es. Super, nun kann ich an meinem Skript weiterarbeiten.

Gruß
Christian

Wenns nicht zu speziell ist vergiss nicht uns dein fertiges erzeugnis vorzustellen :wink:

Anti
der jetzt schon die V2.X im produktiven Einsatz hat. Kann nicht mehr lange dauern bis ich was mit Autoit verknüpfe hihi

Hallo Toni,

ich bin noch nicht so erfahren im Programmieren und vor allem im Umgang mit DLL´s.

Derzeit versuche ich mich an einem autoIT Skript mit Integration der trixiDLL.
Leider stürzt mir autoIT beim Close der DLL ab.

Wie kann ich denn rausbekommen, welche Funktionen die dll unterstützt (dafür gibt es Tools hab ich auch schon rausbekommen), und vor allem welche Rückgabewerte geliefert werden.

Im Beispielskript für AutoIT werden die @error Werte ausgewertet. Die müssten doch von dem Aufruf der dll geliefert werden, oder.

Gibt es dafür noch einige Infos, und wenn wo finde ich die? Vielleicht habe ich es ja auch nur übersehen.

Danke und Gruß
Christian

Das script ist von Anti. Ich selbst hab nicht viel Ahnung von AutoIt.

Schick mir doch mal dein Problem in Form eines AutoIt-Scriptes per PM. Dann schau ich mal wo es hängt. Vielleicht ist ja auch ein Bug die Ursache.

Wie kann ich denn rausbekommen, welche Funktionen die dll unterstützt
Steht in der Demo (= vorläufige Ersatzdoku).

Toni

Habs mir direkt aus deinem Quellcode rausgefrickelt:


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';

// --- Professional implementation -------------------------------------------
type
  TSimpleVarCallback = procedure(ID: Integer);
  TVarCallback = procedure(ID: Integer; Time: Double; Value: PAnsiChar);

procedure SetSimpleVarCallback(Value: TSimpleVarCallback); stdcall external 'TRIXI.DLL';
procedure SetVarUpdateCallback(Value: TVarCallback); stdcall external 'TRIXI.DLL';
procedure SetVarChangeCallback(Value: TVarCallback); stdcall external 'TRIXI.DLL';
function GetScriptIDByName(Script: PAnsiChar; ParentID: Integer): Integer; stdcall external 'TRIXI.DLL';
function GetVariableIDByName(Variable: PAnsiChar; ParentID: Integer): Integer; stdcall external 'TRIXI.DLL';
function VariableExists(VariableID: Integer): Boolean; stdcall external 'TRIXI.DLL';
function ScriptExists(ScriptID: Integer): Boolean; stdcall external 'TRIXI.DLL';
procedure WriteDebugFile(FilePath: PAnsiChar; MsgSink: Boolean); stdcall external 'TRIXI.DLL';

Btw, FilePath ist bei WriteDebugFile ja auch ned so richtig, oder? :wink:

Äh… wiso? :confused:

Weils kein Path ist :wink:
Das ist mir brachial um die Ohren geflogen, als ich da nur nen Pfad angegeben habe. :smiley:


WriteDebugFile("c:\	emp\	rixi.log", false);