Bedingte Kompilierung ??

  • Hallo,

    hatte ne Weile Sendepause, bin jetzt aber wieder an AutoIt dran. Ich habe derzeit das Problem das in meinem Projekt für 2 Benutzergruppen unterschiedliche Funktionen zur Verfügung stehen sollen. Aus Sicherheitsgründen kann ich nicht einfach alle Funktionen für alle einbauen, sondern kompiliere das Script einmal für Anwender, und einmal für Administratoren.
    Bisher habe ich für Anwender die Admin-Funktionen dadurch gesperrt, das ich entweder den entsprechenden Code auskommentiert habe und in der GUI die Controls mit @GUI_HIDE versteckt und disabled habe.

    Bei mittlerweile über 3000 Zeilen Code ist es aber lästig und fehleranfällig bei jeder Version diese ganzen Edits zu machen. Es sind ca 100 Zeilen die ich an 6 verschiedenen Stellen im Code bearbeite.

    Von üblichen Compilersprachen kenne ich die Funktionalität mit einem Preprozessor eine bedingte Kompilierung durchzuführen. Leider habe ich ein AutoIt so eine Möglichkeit nicht gefunden.

    Deshalb meine Frage: Kennt jemand eine Möglichkeit während der Kompilierung bestimmte Codeteile bedingngsabhängig auszulassen? Oder hat jemand dieses Problem anders gelöst?

    Ich habe schon daran gedacht, so etwas im SciTe in der Art eines Tidy einzubauen, aber das ist Neuland für mich. Geht sowas mit Lua überhaupt? ?(

    Bin für alle Anregungen dankbar. Falls jemand mehr Erfolg bei der Suche im Forum (auch im englischen) hat, würde ich mich über Hinweise freuen. Ich habe zu diesem Thema leider nichts gefunden.

    Gruß

  • Hallo Spider,

    danke für den Hinweis, ich habe mir das Tool auch schon heruntergeladen gehabt. Es ist ohne Zweifel ein echt tolles Werkzeug, aber es unterstützt nicht mehrere Codezweige oder erweiterte Preprozessor Direktiven, die über die üblichen au3wrapper hinausgehen. Jedenfalls habe ich in der Hilfe nichts dazu gefunden.

    Falls Du mit dem Tool arbeitest und weißt wie ich in meinen Code neue Preprozessordirektiven einfügen kann, die eine bedingte Kompilierung unterstützen, hilf mir doch bitte mal auf die Sprünge.

    Danke

  • @TrueMu:
    Auf den Namen bin ich auch schon "reingefallen" Leider werden keine zusätzlichen Direktiven unterstützt.
    Ich bin zwar gerade am basteln eines "richtigen" Preprozessors, aber das dauert noch (hatte zwar schon mal einen gebaut, aber ich den muß ich erstmal in eine gängige Sprache umschreiben)

  • Stilgar:

    Danke für die Info. Dann muss ich mir wohl selber was anderes überlegen. Ich werde mal sehen wie weit ich mit #includes komme. Ich hab überlegt meine Funktionen einmal in einer Admin.au3 und einmal in einer User.au3 zu programmieren. Aber ich bin mir nicht sicher wie ich dann mit meinen globalen Variablen etc klarkomme. Muß das noch etwas genauer überdenken. Aber wenn ich schon mal über 50% auf die Art lösen kann, ist es den Aufwand locker wert.

    Gruß

  • Ich hab mal versucht, was zu schreiben. Teste es doch mal:

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=CompileRegion.exe
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <Array.au3>
    ; Namen der zu verwendenden Region setzen #RegionCompile_Set=NAME
    ; Region starten: #RegionCompile_Start=NAME
    ; Region beenden: #RegionCompile_End=NAME
    ; Es kann immer nur eine Region auf einmal verwendet werden.
    ; Die Anweisungen dürfen nicht in der ersten Zeile stehen.

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

    ; Als CompileRegion.exe kompilieren und speichern in:
    ; %scitedir%\CompileRegion\CompileRegion.exe

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

    ;; Autoit3Wrapper verwenden und folgende Codezeilen einfügen:

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

    ;~ #AutoIt3Wrapper_Run_Before=%scitedir%\CompileRegion\CompileRegion.exe -before '%in%'
    ;~ #AutoIt3Wrapper_Run_After=%scitedir%\CompileRegion\CompileRegion.exe -after '%in%'

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

    ; Um die Zeilen komplett aus dem Skript zu entfernen, Obfuscator verwenden, z.B. mit /striponly

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

    Dim $CMDLINES = $CMDLINE
    ;~ Dim $CMDLINES[3] = [2,"-before",@ScriptDir&"\captcha.au3"]

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

    If $CMDLINES[0] = 2 Then
    If $CMDLINES[1] = "-before" Then
    SplashTextOn("CompileRegion", "Make regions for compile")
    $File = FileRead($CMDLINES[2])
    $x = StringRegExp($File, "\s*#RegionCompile_Set=([^;]+)", 1)
    If @error Then Exit
    FileCopy($CMDLINE[2], $CMDLINE[2] & "_original.bak", 1)
    $File = StringRegExpReplace($File, "(\s*#RegionCompile)(_Start=\s*" & StringStripWS($x[0], 7) & ")", @CRLF & "$1_used$2")
    $File = StringRegExpReplace($File, "(\s*#RegionCompile_Start)", @CRLF & "#cs$1")
    $File = StringRegExpReplace($File, "(\s*#RegionCompile)(_End=\s*" & StringStripWS($x[0], 7) & ")", @CRLF & "$1_used$2")
    $File = StringRegExpReplace($File, "(\s*#RegionCompile_End=)", @CRLF & "#cs$1")
    FileDelete($CMDLINES[2])
    FileWrite($CMDLINES[2], $File)
    SplashOff()
    ;~ MsgBox(0, '', $File)
    ;~ FileDelete("D:\test.au3")
    ;~ FileWrite("D:\test.au3",$File)
    ;~ ShellExecute("D:\test.au3")
    ;~ StringRegExpReplace(
    ElseIf $CMDLINES[1] = "-after" Then
    SplashTextOn("CompileRegion", "Restore original Script")
    FileMove($CMDLINES[2] & "_original.bak", $CMDLINES[2], 1)
    SplashOff()
    EndIf
    EndIf

    [/autoit]
    • Offizieller Beitrag

    Hallo,

    ich benutze in diesem Fall immer IsAdmin und aktiviere die entsprechenden Controls/Funktionen nur wenn jemand mit Adminrechten das Programm ausführt. Das hat den Vorteil es gibt nur eine Version des Programms und es kann nicht versehentlich die falsche Version weitergegeben werden!

  • Hallo propagandy,

    das sieht sehr vielversprechend aus. Wenn ich es richtig verstehe liest Dein Programm das Script ein und entfernt mittels RegEx alle Zeilen zwischen den passenden #RegionCompileStart und #RegionCompileEnd Direktiven?

    Das werde ich Montag gleich mal ausprobieren. Oder mal sehen wieviel Lust ich am WE auf Arbeit habe ;)

    Bernd:
    Danke für Deinen Tipp. Leider haben bei mir die meisten Anwender lokale Adminrechte auf Ihren PCs, nur für mein Programm sollen sie halt nicht dessen Adminfunktionen verwenden dürfen. Hätte wohl besser Experten-Modus dazu gesagt.

    Gruß

  • Zitat

    Wenn ich es richtig verstehe liest Dein Programm das Script ein und entfernt mittels RegEx alle Zeilen zwischen den passenden #RegionCompileStart und #RegionCompileEnd Direktiven?


    Genau. Erst werden die #RegeionCompile-Befehler , die verwendet werden umbenannt, sodass diese Code-Blöcke nicht auskommentiert werden. Dann werden die RegionCompile_Start mit #cs erweitert, sodass ein Kommentarblock anfängt. #RegionCompile_End mird mit #ce erweitert, um den Kommentarblockzu beenden.
    Wenn die Blöcke auch entfernt und nicht nut auskommentiert werden sollen, muss man den Obfuscator verwenden.