Frage zu DllCall

  • Halllo zusammen,

    ich hab heute versucht etwas mit DllCall in mein Script einzubauen. Folgenden Befehl wuürde ich gerne per DLlCall ausführen (sofern das möglich ist).

    Originalbefehl laut Nvidia Doku.

    [autoit]

    Run('rundll32.exe NvCpl.dll,dtcfg primary 2')

    [/autoit]

    So wie ich es gern haben würde evtl. auch nur zum Verständniss.

    [autoit]

    $dll = DllOpen(@SystemDir & "\NvCpl.dll")
    DllCall($dll,"int","dtcfg primary",2)
    DllClose($dll)

    [/autoit]

    Nur ich habe schon alle möglichen Konstelationen ausprobiert ohne Erfolg.


    Gruß

    Schnuecks

  • Hi,
    so wie ich aus diesem Manual herausgelesen habe, benötigt die Funktion dtcfg 2 Parameter
    Der DLL-Aufruf in AutoIt würde dann so aussehen

    [autoit]

    $ret=dllcall($dll,"none","dtcfg","Datentyp1",<command>,"Datentyp2",<DisplayNummer>)

    [/autoit]


    In der Beschreibung habe ich Bezeichnung der Datentypen nicht gefunden, würde aber vermuten, daß es sich beim ersten um einen String handelt, beim Zweiten, da auch der Parameter "all" übergeben werden kann, auch...

    [autoit]


    $string1="primary"
    $string2="2"
    $ret=dllcall($dll,"none","dtcfg","str",$string1,"str",$string2)

    [/autoit]


    Da mir die dll nicht vorliegt, kann ich auch nicht reinschauen, was die einzelnen Funktionen an Parametern erwarten...

  • Danke erstmal,

    ich muss jetzt nochmal blöd fragen.

    Kann ich mit DllCall die Dll mit Parametern starten bzw. aufrufen oder bekomme ich von dieser Funktion nur Werte zurück.

    Leider passiert nichts wenn ich deinen Code verwende.

    [autoit]

    $string1="primary"
    $string2="2"
    $ret=dllcall($dll,"none","dtcfg","str",$string1,"str",$string2)

    [/autoit]

    In Scite sehe ich nur den Fehler !>16:19:24 AutoIT3.exe ended.rc:-1073741819


    Die Datei kann ich dir zukommenlassen wenn es hilft, ist Teil des Nvidiatreibers, dürfte ja eigentlich kein Problem sein.


    Gruß

    Schnuecks

  • War ja, wie gesagt, nur von mir vermutet.
    Die @error-abfrage sollte man allerdings mitlaufen lassen, der Einfachheit halber benutze ich Alt+D (Scite). Cursor auf die Variable $ret und dann Alt+D.
    Oder direkt ein richtiges Fehlermanagement. Aber das ist dein Problem, ich werde nicht jedem hier fertige Fehlerabfangroutinen vorbeten, einige Leute hier machen das und züchten damit c&p-Anwender, die beim nächsten Mal wieder nicht in der Lage sind, einfachste Fehler zu lokalisieren.
    Beachte, daß $ret als ein Array von dllcall zurückgegeben wird, ein _arraydisplay($ret) zeigt auch alle übergebenen bzw zurückgegebenen Parameter.
    Ich schau mal, ob ich die dll irgendwo finde...

  • Heute ist nicht mein Tag....ich kann die cab-files des Treibers nicht öffnen
    Pack doch mal das gesamte Verzeichnis, in dem sich die dll befindet und stells als zip hier rein

    • Offizieller Beitrag

    Ich hab mir mal das Manual angeschaut.
    Dort wird die Syntax für dtcfg so angegeben:

    Code
    Format rundll32.exe NvCpl.dll,dtcfg <command> <display#> 
    [arg1] [arg2] [arg3] [arg4]


    Die Funktion hat also 6 Parameter:
    - dtcfg ==> der Funktionsname
    - <command> ==> Befehlsparameter für diese Funktion (z.B. attach oder setmode)
    - <display#> ==> die Nummer des anzusprechenden Displays
    - [arg1 - 4] ==> 4 optionale Parameter

    Datentyp für command und display# könnte man als 'str' und 'int' annehmen. Schwieriger wird es bei den optionalen Parametern. Denn wenn man mal im Manual blättert, werden sowohl Strings als auch Integerwerte an diese Argumente übergeben. 8|

    Aber was spricht eigentlich dagegen, die Befehle als Kommandozeile aufzurufen?
    z.B. "rundll32.exe NvCpl.dll,dtcfg setmode 2 1024 768 32 75" mit Run() aufrufen.

  • Dagegen spricht gar nichts und so mach ich es monetan auch.

    Mich hat soweit nur interessiert ob es auch mit DllCall machbar wäre, mehr nicht.

    Wäre rein zum Verständiniss gewesen, deshalb die Frage.

    LG

    Schnuecks