1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. XovoxKingdom

Beiträge von XovoxKingdom

  • C++ DLL Array mit AutoIt nutzen

    • XovoxKingdom
    • 10. April 2010 um 15:14

    Hi,
    wie der Name schon sagt würde ich gerne eine ein paar Rechnungen in eine C++ DLL auslagern. :P
    Mit den Grundrechenarten bin ich soweit gut zurechtgekommen (+ - * /) :) .
    Nun wollte ich Vektoren (x und y) hinzufügen. Mein Problem dabei besteht in der Ausgabe ;( .
    Ich weiss leider nicht wie ich einen Punkt ausgeben kann.
    Die Konsolenausgabe funktioniert, aber später soll ja ein Returnbefehl die Ausgabe der DLL an
    das AutoItscript weiterleiten.
    Hier erstmal eine Konsolenversion:

    Spoiler anzeigen
    Code
    #include <iostream>
    using namespace std;
    
    
    int main(int argc, char* argv[])
    {
    class Punkt
    {
    public:
    int x;
    int y;
    Punkt(int a, int b)
    {
    x = a;
    y = b;
    }
    void Add(int a, int b)
    {
    x += a;
    y += b;
    }
    
    
    };
    Punkt A(2,1); // Beispielpunkt
    A.Add(3,2);   // Funktionsaufruf
    int P[2];
    P[0] = A.x;
    P[1] = A.y;
    cout << "Der Punkt heisst : P( " << P[0] << " ; " << P[1] << " )"; // Konsolenausgabe
    cin.get();
    return 0;
    }
    Alles anzeigen

    Hier mein Fakultätsscript - DLL (das nur 1 Ergebnis ausgeben kann):

    Spoiler anzeigen
    Code
    __declspec(dllexport) double Fak( double a)
    			{
    				double b = 1;
    				for (int i = 2; i <= a; i++)
    				{
    					b *= i;
    				}
    				return b;
    			}


    der Aufruf in AutoIt war:

    [autoit]

    #include <array.au3>

    [/autoit][autoit][/autoit][autoit]

    $a = DllCall("Bernoulli.dll","double:cdecl","Fak","double","4")
    If (IsArray($a)) Then
    _ArrayDisplay($a)
    EndIf

    [/autoit]


    Hat auch tadellos funktioniert, aber wenn ich 2 Ergebnisse haben will, dann weiss ich nicht wie ich die
    mit C++ mit "Return" übergeben kann und wie ich dann (wenn ich es geschafft hätte) mit autoit weiterverwenden kann.

    Ich hoffe ihr könnt mir helfen! :S

    //Edit : Ich merke grade, heute falle ich mir schwer mich auszudrücken...
    Ich will mit einem(!) Dll Aufruf einen Punkt berechnen!
    Ich übergebe als Parameter den X und den Y Wert und möchte gerne
    als Ergebnis (nach dem Aufruf) in AutoIt den veränderten Punkt (wieder X UND Y Wert)
    bekommen.

  • [Frage]

    • XovoxKingdom
    • 10. April 2010 um 14:52

    Hast du die aktuelle SCITE version?
    HIER
    Falls du nicht die aktuellste AutoIt version hast:
    HIER

  • Musikplayer UDF

    • XovoxKingdom
    • 10. April 2010 um 13:00

    Sehr Gut!
    Das ganze nimmt doch schon solangsam Form an :thumbup:

  • [Frage]

    • XovoxKingdom
    • 10. April 2010 um 12:57

    Ich hoffe dir hilft die Bebilderte "Erklärung"
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

  • AutoIt Bilder

    • XovoxKingdom
    • 10. April 2010 um 11:43

    Dem "Trend" muss ich mich natürlich auch anschließen!
    Hier mein Ergebnis:
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Bilder

    • AutoIt Bild.jpg
      • 54,27 kB
      • 250 × 100
  • Musikplayer UDF

    • XovoxKingdom
    • 10. April 2010 um 10:46

    Ganz interessant würde ich es finden, wenn der Player folgende Funktionen unterstützte:
    Fortschrittsbalken
    Konvertierung (vielleicht mit FFMpeg)
    Playlists (mit Exportfunktion)
    Streamsupport (z.B. für Webradios)
    Wiederholen-Button
    Drag&Drop
    Coveranzeige des aktuellen Liedes (statt einer Visualisierung)

    Das sind jetzt nur Anregungen, die du ggf. auch mit einbauen kannst.
    Falls mir noch mehr spontane Einfälle kommem, dann werde ich die liste erweitern.

    /Edit: Jetzt hab ich ganz das Feedback vergessen :P
    Ich muss sagen, dass ich das Projekt sehr gut finde, da man sich durch deine
    UDF einen eigenen Musikplayer machen kann, der genau das kann was er soll
    und auf jeden fall nicht noch irgendein unnützes Zeug mitbringt (wie manche anderen Player)! Ich finde die Idee also :thumbup: !

  • [Frage]

    • XovoxKingdom
    • 9. April 2010 um 23:06

    Ja :)
    Ich würde dir für die Zukunft vorschlagen, dass du die deutsche Hilfe mitbenutzt, denn durch
    selbstständiges Arbeiten ist meistens der Lerneffekt größer. Ansonsten weiter so!

    EDIT: Huch? warum hast du jetzt einen sleep von 20000? das entspricht 20Sekunden!

  • [Frage]

    • XovoxKingdom
    • 9. April 2010 um 23:02

    Ja, so funktioniert das Script...
    Verbesserungsvorschläge:

    [autoit]

    $Prozessname = "crossfire.exe"
    $Dateiname = "RF017.REZ"
    $Quellpfad = "F:\Programme\Z8Games\CrossFire\rez\"
    $Zielpfad = "C:\Dokumente und Einstellungen\Besitzer\Desktop\"; <-- Dieses Semikolon brauchst du nicht, aber es schadet auch nicht^^

    ProcessWait($Prozessname)
    Sleep (2000);Hier ist alles korrekt
    FileMove($Quellpfad&$Dateiname,$Zielpfad&$Dateiname)
    While ProcessExists($Prozessname)
    Sleep (10); Hier kannst du den Wert auf 10 setzen, damit schneller überprüft wird, ob das Programm bereits beendet wurde!
    WEnd
    FileMove($Zielpfad&$Dateiname,$Quellpfad&$Dateiname)

    [/autoit]


    Offtopic:
    Benutz bitte AutoIt Tags (Das Symbol Rechts neben dem SP-Button)
    - Kann auch in Verbindung mit einem Spoiler verwendet werden

  • [Frage]

    • XovoxKingdom
    • 9. April 2010 um 22:57

    Im Prinzip ein richtiger Ansatz.. jedoch solltest du statt "speep(2000)" doch besser "Sleep(2000)" benutzen :P

  • [Frage]

    • XovoxKingdom
    • 9. April 2010 um 22:48

    Nun hast du noch 2 Fehler drin:
    1. Nach dem Quell UND Zielpfad muss ein \ stehen..
    2. Der Pfad C:C: existiert bestimmt nicht (wäre mir neu)
    Das folgende sollte funktionieren:

    [autoit]

    $Prozessname = "crossfire.exe"
    $Dateiname = "RF017.REZ"
    $Quellpfad = "F:\Programme\Z8Games\CrossFire\rez\"
    $Zielpfad = "C:\Dokumente und Einstellungen\Besitzer\Desktop\";

    ProcessWait($Prozessname)
    FileMove($Quellpfad&$Dateiname,$Zielpfad&$Dateiname)
    While ProcessExists($Prozessname)
    Sleep (10)
    WEnd
    FileMove($Zielpfad&$Dateiname,$Quellpfad&$Dateiname)

    [/autoit]
  • [Frage]

    • XovoxKingdom
    • 9. April 2010 um 22:44
    Zitat von spiolino

    ($F:\Programme\Z8Games\CrossFire\rez&$RF017.REZ,$C:\Dokumente und Einstellungen\Besitzer\Desktop&$Rez)


    Ist syntaktisch falsch.. es müsste richtig:

    [autoit]

    FileMove("F:\Programme\Z8Games\CrossFire\rez\"&"RF017.REZ","C:\Dokumente und Einstellungen\Besitzer\Desktop\"&"RF017.Rez")

    [/autoit]


    heißen.
    Sollte es immernoch nicht klappen, dann sende bitte den Quellpfad, den Zielpfad und den Prozessnamen.
    Anschließend würde ich etwas basteln können, damit wir dem Fehler auf die schliche kommen.
    Ist der Prozess denn wirklich beendet? (Vielleicht benötigst du Adminrechte:

    [autoit]

    #RequireAdmin

    [/autoit]
  • [Frage]

    • XovoxKingdom
    • 9. April 2010 um 22:31

    Du kannst das Lösungsscript eigentlich so wie es ist übernehmen.
    Beispiel (musst die Pfade / Prozessnamen anpassen):

    [autoit]

    $Prozessname = "Firefox.exe";Hier den Prozessnamen eingeben
    $Dateiname = "Textdatei.txt"; ...(ergibt sich oder?^^)
    $Quellpfad = "C:\Mein Ordner\Quelle\"; Bsp: "C:\MeinOrdner\"
    $Zielpfad = "C:\Mein Ordner\Ziel\"; Gleiches Schema wie bei $Quellpfad

    [/autoit][autoit][/autoit][autoit]

    ProcessWait($Prozessname);Wartet auf Prozess
    FileMove($Quellpfad&$Dateiname,$Zielpfad&$Dateiname);Bringt die datei "in sicherheit"
    While ProcessExists($Prozessname);Prüft den Prozess
    Sleep(10)
    WEnd;Falls Prozess NICHT existiert wird die Schleife verlassen
    FileMove($Zielpfad&$Dateiname,$Quellpfad&$Dateiname);Datei wird zurückgespielt

    [/autoit]
  • [Frage]

    • XovoxKingdom
    • 9. April 2010 um 22:12

    Hier erstmal die Funktionen die du brauchst:

    [autoit]

    Winwait();Warten bis das Fenster existiert
    ;Alternativ -falls du wirklich den Prozess meinst: ProcessExists()
    Filemove();Datei von Source nach Desktop verschieben
    While ;Schleifenstart + Bedingung damit die schleife ausgeführt wird
    ProcessExists(); Prüft ob der Prozess existiert
    ;Falls du mit Fenstern arbeitest nimm WinExists()
    sleep(10); Eine Pause
    Wend; Bildet eine Schleife in der man eine Operation bis zu einem bestimmten Event ausführen lassen kann

    [/autoit]

    Lösung:
    (falls du eien Lerneffekt haben willst, dann guck hier erst rein wenn du es wenigstens probiert hast)

    Spoiler anzeigen
    [autoit]

    $Prozessname = "";Hier den Prozessnamen eingeben
    $Dateiname = ""; ...(ergibt sich oder?^^)
    $Quellpfad = ""; Bsp: "C:\MeinOrdner\"
    $Zielpfad = ""; Gleiches Schema wie bei $Quellpfad

    [/autoit] [autoit][/autoit] [autoit]

    ProcessWait($Prozessname);Wartet auf Prozess
    FileMove($Quellpfad&$Dateiname,$Zielpfad&$Dateiname);Bringt die datei "in sicherheit"
    While ProcessExists($Prozessname);Prüft den Prozess
    Sleep(10)
    WEnd;Falls Prozess NICHT existiert wird die Schleife verlassen
    FileMove($Zielpfad&$Dateiname,$Quellpfad&$Dateiname);Datei wird zurückgespielt

    [/autoit]
  • Bild nachladen

    • XovoxKingdom
    • 9. April 2010 um 21:30

    Ich denke, dass das was du sucht in den folgenden Bereich passt:
    Klick Mich
    Ich bin nicht sicher, ob das für dein Ziel relevant war - dennoch vermute ich es mal :D

  • Kopiern von Daten - FileCopy funkt. nicht

    • XovoxKingdom
    • 9. April 2010 um 21:05

    Falls auch das nicht den gewünschten Erfolg bringt, würde ich dir raten einfach:

    [autoit]

    #RequireAdmin

    [/autoit]


    davorzusetzen!

  • Text Suche in Klammern

    • XovoxKingdom
    • 9. April 2010 um 21:00

    Probier mal das Folgende:

    [autoit]

    $String = "Bla bla [p2 m4] bla bla bla"
    $RegEx = StringRegExp($String,".+\[(.+)\].+",3)
    If isArray($RegEx) = True Then MsgBox(0,"Erfolg!","Der Inhalt in der Klammer ist: " & $RegEx[0])

    [/autoit]


    Achtung: Bei der Variante wird davon ausgegangen, dass du nur 1 Klammerterm hast.
    Also sowas:
    HierStehtEtwasUnwichtiges [ Das hier ist wichtig ] Hier wird wieder alles ignoriert

    falls du z.b. "Test[123]test[1234]test" hast,dann wird der letze Term mit "1234" zurückgegeben!

  • Wie compiliere ich x86 und x64-Version in einem Rutsch?

    • XovoxKingdom
    • 9. April 2010 um 19:15

    Wenn du den Compile-Prozess abgeschlossen hast, dann ist doch eine %Programmname%_Obfuscated.au3
    entstanden, oder? Die kannst du doch jetzt einfach als 64bit compilieren oder sehe ich das falsch?!
    Leider kann ich den Prozess nicht testen, da ich kein 64bit OS habe.
    Ungewöhnlich erscheint mir jedoch die Größe des Resultats:
    32bit: 296kb
    64bit: 781kb (auf 64 bit nach Obfuscateprozess gestellt - aus o.g. Gründen kann ich die Funktionalität nicht bestätigen!)
    Ist die Größe immer so gravierend bei 64bit?

  • Array aus Dll-Datei laden.

    • XovoxKingdom
    • 8. April 2010 um 22:36

    Ich muss sagen, dass ich die UDF besonders nützlich finde. :thumbup:
    Leider bin ich jedoch nicht sonderbar versiert im Umgang mit C++ (und der DLL-Erstellung) :S ...
    Könntest du vielleicht den Quellcode von der Test.dll dazuposten?
    Ich würde manche "Operationen" gerne in C++ auslagern, nur kann ich das leider nicht in AutoIt importieren.
    Mit dem Array-Import würde mir sehr geholfen werden. Ein simples Beispiel mit einem Char/String - Array
    und/oder einem int - Array als Dll und deren Aufruf in AutoIt (dllcall) würde mir sehr helfen.
    Vielen Dank für die Mühe! :)

  • GUI input bei klick text löschen

    • XovoxKingdom
    • 7. April 2010 um 17:21

    Hier ein Beispiel für das Prüfen eines Datums:

    [autoit]

    $Testdatum = "23:59"
    $Reg = StringRegExp($Testdatum, "[01][0-9]:[0-5][0-9]|2[0-3]:[0-5][0-9]")
    If $Reg Then
    MsgBox(0,"Datum","Richtig")
    Else
    MsgBox(0,"Datum","Falsch")
    Endif

    [/autoit]


    (Sollte keine falschen Daten zulassen - Keine Garantie, da ich (noch) kein Profi bin :P )

  • Decompiler - Wie kann man sich schützen?

    • XovoxKingdom
    • 4. April 2010 um 15:19
    Zitat von Scripter192

    was dann aber das programmieren schwerer macht weil man ggf. selber durcheinander kommt ^^

    Für diesen Zweck könnte man sich ja einen eigenen Obfuscator/"kleines Verschleierungssscript" basteln.
    Die Hauptproblematik besteht jedoch in der Komplexität des Obfuscators.
    Kleines Beispiel:

    [autoit]

    $Var = 2;Diese Zuweisung kann recht einfach verschleiert werden
    if $Var = 2 Then Msgbox(0,"Test","Der Wert von $Var entspricht genau: "&$Var);Hier darf nur das 1. $Var und das 3. $Var verschleiert werden!

    [/autoit]

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™