Frage zu DLLCall

  • Hallo,
    ich versuche seit etwa einer Woche, das mit den DLLCalls rauszubekommen.
    Leider bisher ohne Erfolg.
    Ich versuch z.B. bei diesem DLLCall rauszubekommen, wo ich die Parameter dazu her bekomme.

    DllCall("user32.dll", "int", "SystemParametersInfo", "int", $SPI_SETSNAPTODEFBUTTON, "BOOL", False, "int", 0, "int", 0)

    Das Tutorial von BugFix kenne ich, aber irgendwie klappt es dennoch nicht.
    Da steht u.a. dass er die notwendigen Informationen aus der Windows API Referenz nimmt, nur da finde ich noch nicht einmal die Parameter des obigen Befehls.
    Eigentlich müssten die ja auch in der Referenz zu finden sein, da der Befehl funktioniert.
    Anscheinend muss man aber da schon genau wissen, wo die gesuchten Informationen stehen, um sie auch zu finden.
    Irgendwie erinnert mich die Referenz an den Spruch:

    "Jetzt wo ich weiß wie das Gerät funktioniert, verstehe ich auch die Bedienungsanleitung."

    Auch der Dependency Walker spuckt bei mir nur massenweise Daten und vor allem Fehlermeldungen aus.
    Angeblich kann er die Datei, die er gerade geöffnet hat plötzlich nicht mehr finden:D.

    Gibt es da nicht auch noch andere Infoquellen?
    Den nur mit Dependency Walker und API Referenz ist das ganz schon ein etwas sehr schwieriges Unterfangen.

    MfG:
    BigRox

    Einmal editiert, zuletzt von SOLVE-SMART (5. April 2024 um 14:38)

  • Hallo,
    ich habe mir mal einige DLLCalls angeschaut und diese mit den Angaben in der Windows API Referenz verglichen.
    Dabei habe ich zuerst mal festgestellt, optionale Parameter gibt es dabei anscheinend nicht, man muss immer alle Parameter angeben. Und die Dateitypen müssen stimmen.

    Dann habe ich mal diesen DLLCall ausprobiert um damit die Maussonar-Option einzuschalten.

    DllCall("user32.dll", "bool", "SystemParametersInfoA", "uint", "SPI_SETMOUSESONAR", "uint", True, "ptr", Null, "uint", 0)

    Nur irgendetwas ist daran noch falsch, es tut sich nämlich gar nichts.
    Anscheinen habe ich das mit den Dateitypen doch noch nicht so ganz durchschaut und brauch noch etwas mehr Hilfe dabei.

    MfG:
    BigRox

    Einmal editiert, zuletzt von SOLVE-SMART (5. April 2024 um 14:38)

  • Hallo Funkey,
    jetzt hatte ich gedacht, dass ich das mit dem DllCall etwas durchschaut hätte.
    Aber "Irrtum sprach der Igel..."

    Warum kann ich den SPI_SETMOUSSONAR nicht verwenden, sondern muss die Konstante von AutoIt (oder 0x101D) verwenden?
    Und warum muss ich bei einem PVOID-Datentyp UINT-angeben?

    MfG:
    BigRox

  • Warum kann ich den SPI_SETMOUSSONAR nicht verwenden, sondern muss die Konstante von AutoIt (oder 0x101D) verwenden?

    Weil du eine Zeichenkette übergeben hast, erforderlich ist aber UINT.

    Und warum muss ich bei einem PVOID-Datentyp UINT-angeben?

    Schau Mal in der Hilfe, da findest du eine Auflistung, welche Datentypen als Entsprechung in AutoIt zur Verfügung stehen.

  • Hey BigRox,

    Warum kann ich den SPI_SETMOUSSONAR nicht verwenden, sondern muss die Konstante von AutoIt (oder 0x101D) verwenden?

    SPI_SETMOUS E(das E vergessen?!) SONAR (in dem Fall als Variablenname in der API-Definition) IST 0x101D. Google mal nach SPI_SETMOUSESONAR und du findest https://learn.microsoft.com/de-de/windows/…parametersinfoa

    Alle Parameter zu den Funktionsaufrufen findest du in den *.h-files, das h steht für header. Diese Systemdateien werden idR. bei der Installation eines C/C++-Compilers mitinstalliert, du kannst einzelne aber auch einfach bei google suchen und bekommst dann Links zu bspw. Github. Dort kannst du dann in die h-files reinschauen und die Definition des Parameters nachvollziehen.

    Dein Fehler war, anstatt die Variable SPI_SETMOUSESONAR zu verwenden, den TEXT(!) "SPI_SETMOUSESONAR" einzusetzen. In den API-Funktionsbeschreibungen gibt es zwar auch text-Parameter, in diesem Fall ist aber ein UINT gefragt.

    Wenn mir irgendwelche esoterischen Datentypen unterkommen, (in C/C++ und auch anderen Sprachen kannst du selbst deine Datentypen definieren), dann schaue ich mir die *.h-files an und ggf. andere Programmierbeispiele.

    Und warum muss ich bei einem PVOID-Datentyp UINT-angeben?

    Hehe, auch hier ist google dein Freund :o)

    Beckhoff Information System - German

    Letztendlich beschränken sich die Datentypen auf 8, 32- oder 64-Bit Datentypen. C-Typisch werden selbst bei den kompliziertesten und komplexesten strukturierten und völlig sinnfrei von irgendeinem XY_Programmierer-zusammengepfriemelt aufgebauten Datentypen nur sog. Pointer, also Zeiger auf diese Struktur in der Funktion übergeben. Innerhalb der Funktion wird dann über die tippeltappeltour auf den Pointer vom Pointer auf die Liste auf eine Verkettung von Pointern auf eine Struct uswusf. verwiesen und dort die Daten ermittelt. Damit du nicht zig Variablen übergeben musst, werden diese zusammengefasst und per Pointer, auf bspw. eine Struct oder auch auf Programmcode, übergeben.

  • Hallo,

    SPI_SETMOUS E(das E vergessen?!) SONAR

    Im Post habe ich das E wirklich nur vergessen, kann ja schon mal vorkommen:whistling:.

    Weil du eine Zeichenkette übergeben hast, erforderlich ist aber UINT.

    Da habe ich wohl irgendwie den Durchblick verloren, wie war das noch mit den Bäumen und dem Wald...

    Was PVOID angeht , das ist anscheinend nur eine Art Platzhalter für den zu übergebenden Dateityp.
    Anscheinend komme ich so langsam dahinter, wie das mit dem DLLCall geht.

    MfG:
    BigRox

  • Habe mir da zu wenig Zeit genommen und Verwirrung gestiftet mit der Übergabe von UINT anstelle vom Pointer.

    Es funktioniert, aber es ist nicht richtig so. Außerdem wird ein 'True' bei einem Pointer leider auf 0 und nicht auf 1 gecastet, deshalb habe ich den Integer-Typen verwendet.

    Hier nochmal ein Code zum Testen: