DLL - Frage

  • Ich bin noch ziemlich "neu" in AutoIT und wollte mal Fragen, ob es eine DLL (dynamische Programmbibliothek) gibt, die alle für AutoIT evtl. wichtige (z.B. user32.dll, shell32.dll, kernel32.dll etc.) DLL´s enthält.
    Anders gefragt: ibt es eine Möglichkeit alle Funktionen von verschiedenen DLL´s in eine einzige DLL zusammenzufassen?

    Die zweite Frage wäre folgende: Ich bekomme bald einen neuen Computer mit Windows 7 ultimate 64-bit. Wenn ich alle DLL´s von Windows XP (denn auf den PC, wo ich meine Skripte schreibe, läuft Windows XP 32-bit) in einem Skript in WIndows 7 ultimate 64-bit verwende, funtkionieren noch alle Funktionen und sehen evtl. sogar die Fenster so aus wie in Windows XP? Oder gibt es da vielleicht eine andere Möglichkeit?

    Vielleicht hat das in euren Augen kein Sinn, aber ich will es einfach mal nur so wissen.

    MfG

    Seikuassi

    Einmal editiert, zuletzt von Seikuassi (10. Mai 2013 um 23:53)

  • Also einen Grund diese Dll's zusammenzufassen sehe ich beim besten Willen nicht und es ist wahrscheinlich auch nicht einfach so möglich. Ausserdem hast du diese ja sowieso auf jedem PC und die Dll's z.B. von XP nach 7 mitzunehmen wird sehr wahrscheinlich nicht funktionieren.

    Dein Script kannst du natürlich genau so wie es ist auch auf einem Win7 PC ausführen, die Fenster werden aber den Win7 Style haben. Das lässt sich mit Standartmitteln aber auch nicht umgehen (so weit ich weis). Brauchst du ja aber eigentlich auch nicht.

    Gruss Shadowigor

  • Die Fenster sehen alle so aus, wie es sich für das Betriebssystem gehört, man kann aber für diese den Windows 95-Modus erzwingen.

    64-bit Systeme können Programme im 32-bit Modus ausführen und dann auch alle Dlls normal verwenden.

    Wenn man es kompliziert genug macht wird man auch irgendwann Grenzen erreichen, an denen man Unterschiede finden, aber normalerweise braucht man das nicht.

    Ich denke mal, deine Skripte gehen von der Komplexität nicht weit über von GUIs, Dateien und Netwerke hinaus, dabei brauchst du noch nicht wirklich auch das Betriebssystem achten.

  • Hi,
    wie schon gesagt funktionieren deine Scripte auch unter Win7 (die meisten jedenfalls^^), allerdings im "Win7"-Style.
    Wenn du, aus welchen Gründen auch immer, unbedingt auf XP angewiesen bist, oder Fenster in diesem Style brauchst (oder Fenster in diesem Style "bearbeiten" musst *husthust*) dann erstelle dir entweder eine Virtuelle Maschine VM und benutze darin einfach deinen "alten" Rechner (Image erstellen und reinkopieren), oder probiere in Win7 Ultimate das integrierte (auch in einer VM laufende) XP.
    Ich würde das integrierte XP verwenden, dort installierte Programme hast du sogar im Startmenü von Win7....

  • Hallo,

    danke für eure Antworten! Es gibt doch die DLL "uxtheme.dll", die doch irgendwie die Fensterstile verändern kann. Kann mich da jemand aufklären?
    Toll wäre es, wenn es eine Version dieser DLL gibt, die Windows 7-Fenster auf Windows XP bekommen kann UND umgekehrt.
    Falls es so etwas gibt, könnt Ihr mir ja mal einen Link schicken.

    Danke im Voraus!

    Seikuassi

  • Gibt es dann außerdem noch die Möglichkeit, eine DLL in einen Skript einzubinden und in dem Skript zu verwenden, ohne diesen temporär zu speichern (FileInstall). Klar, es gibt die "Resource.au3", aber ich möchte eben nur eine für DLL´s.

    Vielleicht kann man (und das wäre wohl das Beste (für mich)) eine UDF machen, die im Prinzip nur einen Befehl hat:

    (BEISPIEL)

    [autoit]

    $file0 = IncludeData ( [Pfad zur Datei] , [Dateityp] )

    [/autoit]


    Und dann könnte ich eben diese Datei im Skript einfach verwenden.
    Z.B. so:

    [autoit]


    $file0 = IncludeData ('C:\Programme\Beispiel\user32.dll',TypDLL)
    $file1 = IncludeData ('C:\Programme\Beispiel\Bild.jpg',TypJPG)
    $file2 = IncludeData ('C:\Programme\Beispiel\Game.exe',TypEXE)

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

    $DLL0 = DLLOpen ($file0)
    DLLClose ($DLL0)

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

    GUICreate ('',640,400)
    GUICtrlCreatePic ($file1,-1,-1)
    FileCopy ($file2,'C:\Programme',9)
    Exit

    [/autoit]

    Wäre das evtl. möglich zu realisieren oder gibt es ähnliche Alternativen?

    Danke im Voraus!

    Seikuassi

  • Das Problem an fast allen AutoIT-Befehlen ist, dass diese immer einen Pfad brauchen. Somit kann man also keine DLL mit DLLOpen (...) direkt aus dem Programm aufrufen.
    Also werde ich nun doch mithilfe von FileInstall (...) Dateien auf meinen temporären Ordner übertragen, benutzen und dann anschließend wieder löschen.
    Trotzdem danke nochmal für eure Hilfe.

    Bevor ich den Thread als "gelöst" kennzeichne, würde ich noch gerne mehr über die "uxtheme.dll" wissen. Speziell eben über das ändern des WIndows-Stiles unter Windows 7 ultimate 64-Bit.
    Ist es nun möglich ein Windows XP-Fenster unter Windows 7 ultimate anzuzeigen mithilfe dieser DLL? Und wenn ja, wie?
    Danke im Voraus!

    MfG

    Seikuassi

  • Das Ändern ist nicht möglich. GUIs sind zum möglichst übersichtlichen und angenehmen Benutzen da und dieses sollte in jeder Windows Version bleiben. Wenn du wirklich einen eigenen Stil setzen willst, musst du eigene Libraries verwenden. Mit der Uxtheme.dll kann man nur auf Windows 95 "resetten".

  • Hi,

    Starten von DLL-Funktionen aus dem Speicher ist möglich.
    Dll-"Inhalt" per dllstructcreate() usw. in Speicher schreiben und die Funktionen dort per DLLCallAddress() aufrufen.
    Die Adressen bzw. Offsets kann man sich per _WinAPI_GetModuleHandle() holen....

    • Offizieller Beitrag

    Bevor ich den Thread als "gelöst" kennzeichne, würde ich noch gerne mehr über die "uxtheme.dll" wissen. Speziell eben über das ändern des WIndows-Stiles unter Windows 7 ultimate 64-Bit.
    Ist es nun möglich ein Windows XP-Fenster unter Windows 7 ultimate anzuzeigen mithilfe dieser DLL? Und wenn ja, wie?


    Wenn Du damit den klassischen Stil meinst. Das geht so:

    Spoiler anzeigen
    [autoit]


    #include <SliderConstants.au3>
    #include <StaticConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>

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

    Global $hGui = GUICreate('Klassische Progressbar', 420, 280, -1, -1)

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

    DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 0) ; auf den klassischen Style umschalten
    Global $hProgress1 = GUICtrlCreateProgress(15, 20, 384, 20, $PBS_SMOOTH) ; obere Progressbar erstellen
    GUICtrlSetColor(-1, 0x22FF22)
    GUICtrlSetBkColor(-1, 0xEEEEEE)
    GUICtrlCreateLabel('|', 18, 40, 20, 16) ; Anzeige von 0%
    GUICtrlCreateLabel('0%', 11, 56, 25, 16, $SS_CENTER)
    GUICtrlCreateLabel('|', 396, 40, 20, 16) ; Anzeige von 100%
    GUICtrlCreateLabel('100%', 389, 56, 25, 16, $SS_CENTER)

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

    Global $hLabel1 = GUICtrlCreateLabel('0%', 190, 23, 30, 14, $SS_CENTER) ; Prozentanzeige innerhalb der Progressbar
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) ; Transparenter Hintergrund für das Label

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

    Global $hProgress2 = GUICtrlCreateProgress(15, 160, 384, 20, $PBS_SMOOTH) ; untere Progressbar erstellen
    GUICtrlSetColor(-1, 0xC83131)
    GUICtrlSetBkColor(-1, 0xEEEEEE)

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

    For $i = 0 To 100 Step 10 ; die Anzeige für die Prozentwerte der unteren Progressbar erstellen
    GUICtrlCreateLabel('|', 16 + $i * 3.8, 180, 20, 16)
    GUICtrlCreateLabel($i & '%', 9 + $i * 3.8, 196, 25, 16, $SS_CENTER)
    Next

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

    Global $hSlider = GUICtrlCreateSlider(5, 130, 404, 28, BitOR($TBS_TOOLTIPS, $TBS_AUTOTICKS))
    GUICtrlSetData(-1, 33) ; Sliderwert auf 33% setzen (als Beispiel)

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

    Global $hClose = GUICtrlCreateButton('Close', 180, 240, 60, 24)
    DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 7) ; zurück zum Standard-Windowsstyle

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

    GUISetState(@SW_SHOW)

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

    Global $iAddend = 1 ; globale Variable (dient als Summand für _SetProgress)
    AdlibRegister('_SetProgress', 50)

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE, $hClose
    AdlibUnRegister()
    Exit
    EndSwitch
    WEnd

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

    Func _SetProgress()
    Local $iPercent = GUICtrlRead($hProgress1) ; Prozentwert der oberen Progressbar auslesen
    If $iPercent = 100 Or $iPercent = 0 Then $iAddend = -$iAddend ; wenn 100 oder Null, dann den Summand negieren
    GUICtrlSetData($hProgress1, $iPercent + $iAddend) ; neuen Wert der oberen Progressbar schreiben
    GUICtrlSetData($hLabel1, $iPercent + $iAddend & '%') ; neuen Wert für das Label schreiben
    GUICtrlSetData($hProgress2, GUICtrlRead($hSlider)) ; und den Wert vom Slider in die untere Progressbar schreiben
    EndFunc ;==>_SetProgress

    [/autoit]
  • Danke für den Tipp! Nochmal kurz zu den DLL´s. Ich habe jetzt den Resource Hacker FX heruntergeladen und einige Icons in diesen geladen. Klappt ganz gut, doch ich würde gerne wissen, wie ich Strings aus der DLL laden kann.

    [Blockierte Grafik: http://www.fotos-hochladen.net/uploads/stringam72dou6t9.jpg
    Würde das irgendwie mit FileOpen (...) funktonieren? Und wenn ja, wie?

    Danke im Voraus!

    Seikuassi

    P.S.: Der String kommt aus einer .dat-Datei!

    2 Mal editiert, zuletzt von Seikuassi (2. Mai 2013 um 17:34)

  • Hi,

    Starten von DLL-Funktionen aus dem Speicher ist möglich.
    Dll-"Inhalt" per dllstructcreate() usw. in Speicher schreiben und die Funktionen dort per DLLCallAddress() aufrufen.
    Die Adressen bzw. Offsets kann man sich per _WinAPI_GetModuleHandle() holen....

    Und wie soll das gehen (z.B. bei user32.dll?). Bitte ein Beispiel geben!

    Danke im Voraus!

    MfG

    Ph. Buchmann

  • Hi,

    Zitat

    Und wie soll das gehen (z.B. bei user32.dll?). Bitte ein Beispiel geben!


    Ich habe dieses Verfahren schon in mehreren Scripten verwendet, wenn dich das Thema so interessieren würde, wären dir diese Scripte bekannt, oder du hättest in den entsprechenden Threads die Anwendung der verwendeten Funktionen nicht verstanden und dort nachgefragt.
    Auch im "blauen" Forum hättest du reihenweise Informationen bekommen, such dort mal nach Subrogation.
    Weiterhin liefert die Anfrage bei der Suchmaschine deiner Wahl tausende von Treffern incl. Beispielprogrammen!

    Es wäre auch bestimmt kein Problem gewesen, nach DllCallAddress() zu suchen, aus welchem Grund denkst du, ist dieser Befehl überhaupt in AutoIt umgesetzt worden?
    Die Win-API wurde auch größtenteils in AutoIt umgesetzt, bissl stöbern in MSDN schadet sicher nicht. Da stößt man dann zwangsläufig nach einigen Minuten u.a. auf

    [autoit]

    _WinAPI_GetModuleHandle()

    [/autoit]

    und GetProcAddress().

    Und nein, ich lege nur ungern jemandem den Arm aus der Sonne.... ;)

  • Also gut, ich habe es verstanden.

    Danke für eure Hilfe!

    Edit: Ups, noch nicht ganz gelöst fürchte ich. Wie kann ich denn nun den String aus der DLL laden (s. oben Bild)?

    Danke im Voraus!

  • Hi,

    Zitat

    Edit: Ups, noch nicht ganz gelöst fürchte ich. Wie kann ich denn nun den String aus der DLL laden (s. oben Bild)?

    Wie wärs, wenigstens ausnahmsweise mal, die Suchfunktion zum Thema zu bemühen?
    FindResource() hilft dir weiter, woher ich das weiß? Google ist mein Freund! Da habe ich nach nichtmal 10 Sekunden im "blauen" Forum eine (von mehreren) UDF zum Thema Resourcen gefunden....
    Wenn du nicht weißt, wie man effizient sucht und findet, wieso fragst du dann nicht?