DLL parameter

  • Huhu,

    also aus der dll bekommst du die Parameter nicht!

    Die Parameter eines dll Aufrufs müssen bekannt sein ( Doku ), nur dann ist
    es möglich eine UDF dafür zu erstellen.

    Es sei denn du willst per Reverse Engineering die dll zerlegen und darüber
    an die in den Funktionen verwendeten Parameter/Variablen kommen.

    Lg,

    Pustekuchen

  • Ok, da sich dir diese Frage stellt.. eine kurze Antwort..

    1) Grundlegendes Wissen über Programmierung in Hochsprachen wie C, C++ zulegen
    2) Grundlegendes Wissen über ASM / x86-Maschinensprache zulegen
    3) Grundlegendes Wissen über Werkzeuge wie IDAPro od. ähnliches zulegen.

    Und in ein paar Wochen/Monaten hier über deine Fortschritte & Erfahrungen schreiben :o)

    Lg,

    Pustekuchen

  • Das Problem ist so simpel wie offensichtlich.
    Man kann in 95% der Fälle (vllt sogar mehr) herausfinden welche Funktionen eine DLL enthält, wenn man deren Bezeichnung, Versionsnummer und Verwendungszweck kennt.
    Nur von: "Ich hab hier eine Dll, ich will die Funktionen ansteuern" kommt keiner weit.

    als Beispiel (geraten, da ich jetzt keine Lust habe^^):
    GDIPlus
    Version 1.0
    Grafikmanipulation

    Damit könnte ein Googlebenutzer in der mdsn (oder im Fall GDI+ auch an anderen Stellen) die Lösung auf deine Fragen finden.

    Edit:
    Falls du Quellcode oder sonstigen Zusazuinfos oder was weiß ich habe ist es immer praktisch das zu sagen.
    Da kann man auch ne Menge raus Lesen.

  • Ein Paar fragen an dich:

    1. Wie heißt die dll?
    2. Wo hast du diese her?

    --------------------------------------
    Es ist durchaus möglich, dass der eine oder andere AutoIt-User diese dll kennen könnten. Zudem ist es dann auch einfacher Informationen dazu zu beschaffen, wenn wir ein bisschen mehr zu der dll wissen.

    --> Dann sparst du dir das zerlegen der dll.

  • Das Problem is das i selber darüber net viel weis.

    Hab ein Alien (Alienware Notebook),
    Und bei denen leuchten die tasten, touchpad, lautsprecher...

    Diese sind über das command center von den farben, takt, übergänge her steuerbar
    Das ganze nennt sich AlienFX

    Ich weis noch nicht welche dll vom command center i benutzen muss,
    Da ich 20 dlls habe die im Namen "LightFX" enthalten
    Jedoch schätze ich das es die LightFX.dll ist.

    Es gibt auch ein plugin für winamp und deren source code in c++.
    hab es mir bereits angesehen, kann aber leider kein c++.

    Spoiler anzeigen

    Achja und es gibt schon ein skript in autoit dazu,
    nur fehlt die dll.

    Spoiler anzeigen
  • Hmn :/ | Ich kann leider auch nichts im Netz finden (9 Treffer). Bzw. Auch nicht ein nützliches tool, was dir die Parameter ausspuckt.
    >> Du kommst wohl nicht drum herum das ganze zu zerlegen. s.o.

  • So hab nun endlich neue informationen gefunden
    in einer pdf.

    Aber irgendwie funzt es net
    Is daran irgendwas falsch:

    Spoiler anzeigen
    [autoit]

    $sPath = "LightFX.hDll"
    $hDll = DllOpen($sPath)

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

    ;--------------------------------------------------------------------------------------------
    ;5.2 LFX_Initialize
    ;Prototype:
    ;LFX_RESULT LFX_Initialize();
    ;Description:
    ;This blocking function initializes the Alienware AlienFX® system. It must be called prior to
    ;other library calls made. If this function is not called, the system will not be initialized
    ;and the other library functions will return LFX_ERROR_NOINIT or LFX_FAILURE.
    ;Inputs:
    ;None
    ;Outputs:
    ;None
    ;Returns:
    ;LFX_SUCCESS if the system is successfully initialized, or was already initialized
    ;LFX_FAILURE if initialization fails
    ;LFX_ERROR_NODEVS if the system is initialized, but no devices are available
    ;--------------------------------------------------------------------------------------------

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

    DllCall($hDll, 'uint', 'LFX_Initialize')

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

    ;--------------------------------------------------------------------------------------------
    ;5.4 LFX_Reset
    ;Prototype:
    ;LFX_RESULT LFX_Reset();
    ;Description:
    ;This non-blocking function sets all lights in the Alienware AlienFX® system to their ‘off’ or
    ;uncolored state. Note that the change(s) to the physical light(s) do not occur
    ;immediately. These changes occur only after a call to LFX_Update. For example, to
    ;disable all lights, call LFX_Reset followed by LFX_Update.
    ;Inputs:
    ;None
    ;Outputs:
    ;None
    ;Returns:
    ;LFX_ERROR_NOINIT if the system is not initialized
    ;LFX_ERROR_NODEVS if there are no devices available to reset
    ;LFX_SUCCESS otherwise
    ;--------------------------------------------------------------------------------------------

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

    DllCall($hDll, 'uint', 'LFX_Reset')

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

    ;--------------------------------------------------------------------------------------------
    ;5.14 LFX_Light
    ;Prototype:
    ;LFX_RESULT LFX_Light(
    ;const unsigned int locationMask,
    ;const unsigned int colorVal);
    ;Description:
    ;This non-blocking function submits a light command into the command queue, which
    ;sets the current color of any lights within the provided location mask to the provided
    ;color setting. Similar to LFX_SetLightColor, settings are changed in the active state and
    ;must be submitted with a call to LFX_Update. Location mask is a 32-bit field, where each
    ;of the first 27 bits represents a zone in the virtual cube representing the system. Color is
    ;packed into a 32-bit value as ARGB, with the alpha value corresponding to brightness.
    ;Parameter 1:
    ;Index to the target device
    ;Parameter 2:
    ;Index to the target light
    ;Parameter 3:
    ;Pointer to an LFX_COLOR structure with the desired color
    ;Inputs:
    ;Accepts a 32-bit location mask
    ;Accepts a 32-bit packed color value
    ;Outputs:
    ;None
    ;Returns:
    ;LFX_ERROR_NOINIT if the system is not initialized
    ;LFX_FAILURE if some other error occurred
    ;LFX_SUCCESS otherwise
    ;--------------------------------------------------------------------------------------------

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

    ;Ich versteh hier net wie ich diesen c++ Pointer mit dieser LFX_COLOR structure machen muss
    ;Und ob da 'char' hin muss, wenn i nähmlich 'uint' nehme gibts einen Fehler in Autoit
    $Strut = DllStructCreate('char 0x00FF0000;char 0xFF000000')
    $Call = DllCall($hDll, 'uint', 'LFX_Light', 'char', 0x000200, 'char', $Strut)

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

    ;--------------------------------------------------------------------------------------------
    ;5.5 LFX_Update
    ;Prototype:
    ;LFX_RESULT LFX_Update();
    ;Description:
    ;This non-blocking function updates the Alienware AlienFX® system by submitting any state
    ;changes (since the last call to LFX_Reset) to hardware.
    ;Inputs:
    ;None
    ;Outputs:
    ;None
    ;Returns:
    ;LFX_ERROR_NOINIT if the system is not initialized
    ;LFX_ERROR_NODEVS if there are no devices available to update
    ;LFX_FAILURE if some other error occurred
    ;LFX_SUCCESS otherwise
    ;--------------------------------------------------------------------------------------------

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

    DllCall($hDll, 'uint', 'LFX_Update')

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

    DllClose($hDll)

    [/autoit]

    Noch eine Frage:
    Es heist ja immer "Returns: LFX_ERROR_NOINIT if the system is not initialized"
    aber wie bekomme ich die ausgabe der dll?

  • LFX_Initialize, LFX_ERROR_NOINIT, etc. sind defines aus C. Sie sollen Nummern repräsentieren. Wurde LFX_ERROR_NOINIT z.B. als 1 definiert, wirst du bei diesem Fehler eine 1 zurückbekommen. Deshalb funktioniert dein Script auch nicht. Du musst als Parameter nicht z.B. LFX_Initialize übergeben, sondern die Nummer, als die LFX_Initialize definiert wurde. Das müsste auch in diesem pdf stehen.

    Gruss Shadowigor

  • Zitat
    [autoit]

    $sPath = "LightFX.hDll"

    [/autoit]

    du hast "LightFX.hDll" geschrieben... bist du sicher, dass du nicht "LightFX.Dll" meintest?

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • Vielen Dank hab i verbessert mit hDll
    funzt leider immer no net.


    Zitat

    LFX_Initialize, LFX_ERROR_NOINIT, etc. sind defines aus C. Sie sollen Nummern repräsentieren. Wurde LFX_ERROR_NOINIT z.B. als 1 definiert, wirst du bei diesem Fehler eine 1 zurückbekommen. Deshalb funktioniert dein Script auch nicht. Du musst als Parameter nicht z.B. LFX_Initialize übergeben, sondern die Nummer, als die LFX_Initialize definiert wurde. Das müsste auch in diesem pdf stehen.

    Also hab jetzt nach gesehen und der Funktionsaufruf wird schon so übergeben:

    [autoit]

    DllCall($hDll, 'uint', 'LFX_.......', ...)

    [/autoit]
  • Kann nicht sein. Das kann nur unter C mit dem entsprechenden Header funktionieren. Aber in AutoIt definitiv nicht. Irgendwo in der Dokumentation müsste stehen als was diese Werte definiert sind. Oder hast du irgendwo eine .h Datei bei der DLL wo es drinsteht?

  • Shadowigor: woher willst du das wissen? Ich hab jetzt keine Dokumentation davon vorliegen, aber ich würde spekulieren, dass LFX_ERROR_NOINIT ein Define aus C ist und LFX_Initialize einfach eine normale Funktion ist. Ansonsten gäbe dieser Code hier, der hier im Thread schon mal gepostet wurde (hier) wenig sinn. Dort kommt auch DllCall($hLightFX, 'uint', 'LFX_Initialize') mit LFX_Initialize als Funktion vor. Das geht zumindest auch aus den Doku-Kommentaren im Script von AutoItfreak hervor.
    AutoItfreak: lass dir doch einfach mal ausgeben, was die einzelnen DllCalls zurückgeben. Dann weißt du schonmal an welcher Stelle es hängt.

    lg
    Developer30

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • Ah, ok sorry hab mich verlesen. Ja LFX_Initialize ist die Funktion. Aber du müsstest trotzdem wissen für was zB. LFX_ERROR_NOINIT steht. Aber du hast recht dann sollte es funktionieren.

  • Es wär gut, wenn du sagen könntest WAS nicht geht. Wenn gar nichts geht, dann schau doch einfach mal nach jedem DllCall, was los ist.

    Spoiler anzeigen
    [autoit]

    $hDll = DllOpen($sPath)
    ConsoleWrite($hDll&@CRLF)

    [/autoit]

    wenn hier z.B. -1 ausgegeben wird, dann weißt du z.B. dass die DLL nicht geöffnet ist.

    [autoit]

    DllCall($hDll, 'uint', 'LFX_Initialize')
    ConsoleWrite(@error&@CRLF)

    [/autoit]

    wenn hier eine Zahl >0 ausgegeben wird, weißt du, dass hier was nicht stimmt.. usw..

    und wenn nirgendwo ein Fehler ist, aber trotzdem nichts funktioniert, dann geben deine DLLCalls keinen sinn.

    Wenn du ein x64 PC hast und die DLL für x86 ist, dann schreibe zu Beginn deines Codes auch noch

    [autoit]

    #AutoIt3Wrapper_UseX64=n

    [/autoit]

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."