_GDIPlus_Startup /_ShutDown innerhalb von UDF

    • Offizieller Beitrag

    Wenn ihr eine UDF erstellt, die Funktionen der GDIPlus.au3 verwendet, müßt ihr ja bei der Anwendung beachten, ob nicht bereits das aufrufende Skript GDIPlus gestartet hat.
    Ich verwende dazu die nachfolgende Lösung, vielleicht auch für euch interessant:

    Edit:
    Wie sich gezeigt hat, ist diese Überprüfung nicht erforderlich, da GDIP intern die Anzahl _Startup/_ShutDown zählt und verrechnet.
    Aber nun wißt ihr, wie man es machen kann, wenn es nötig wäre. :D

    [autoit]

    Func _Irgendeine_UDF()
    ;....
    _GDIPlus_CheckRun() ; <== statt _GDIPlus_Startup()
    ; beliebige GDIPlus-Funktionen
    _GDIPlus_CheckRun(0) ; <== statt _GDIPlus_ShutDown()
    ;....
    EndFunc

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

    ;===============================================================================
    ; Function Name....: _GDIPlus_CheckRun
    ; Description......: Führt _GDIPlus_Startup/ _ShutDown nur aus, wenn GDIP nicht aktiv
    ; Parameter(s).....: $_iStart 1 (Standard) für _Startup, 0 für _ShutDown
    ; Requirement(s)...: #include <GDIPlus.au3>
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _GDIPlus_CheckRun($_iStart=1)
    Local Static $fOpenLocal = False ; nur wenn GDI+ nicht aktiv wird es lokal geöffnet
    If $_iStart = 1 Then
    If $ghGDIPDll = 0 Then ; Globales GDIPlus.Dll - Handle aus der GDIPlus.au3
    $fOpenLocal = True
    _GDIPlus_Startup()
    EndIf
    Else
    If $fOpenLocal Then
    $fOpenLocal = False
    _GDIPlus_ShutDown()
    EndIf
    EndIf
    EndFunc ;==>_GDIPlus_CheckRun

    [/autoit]
  • _GDIPlus_Startup() kann man immer ausführen, es wird doch nur noch ein zusätzlicher Zähler hochgezählt wenn man GDIP startet. Wenn man _GDIPlus_Startup() 20x ausführt, dann wird auch erst beim zwanzigsten Mal _GDIPlus_Shutdown() wirklich GDIP beendet.

  • Hier beide Funktionen:

    _GDIPlus_Startup():

    [autoit]


    Func _GDIPlus_Startup()
    $giGDIPRef += 1
    If $giGDIPRef > 1 Then Return True

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

    $ghGDIPDll = DllOpen("GDIPlus.dll")
    If $ghGDIPDll = -1 Then
    $giGDIPRef = 0
    Return SetError(1, 2, False)
    EndIf
    Local $tInput = DllStructCreate($tagGDIPSTARTUPINPUT)
    Local $tToken = DllStructCreate("ulong_ptr Data")
    DllStructSetData($tInput, "Version", 1)
    Local $aResult = DllCall($ghGDIPDll, "int", "GdiplusStartup", "struct*", $tToken, "struct*", $tInput, "ptr", 0)
    If @error Then Return SetError(@error, @extended, False)
    $giGDIPToken = DllStructGetData($tToken, "Data")
    Return $aResult[0] = 0
    EndFunc ;==>_GDIPlus_Startup

    [/autoit]

    _GDIPlus_Shutdown():

    [autoit]


    Func _GDIPlus_Shutdown()
    If $ghGDIPDll = 0 Then Return SetError(-1, -1, False)

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

    $giGDIPRef -= 1
    If $giGDIPRef = 0 Then
    DllCall($ghGDIPDll, "none", "GdiplusShutdown", "ptr", $giGDIPToken)
    DllClose($ghGDIPDll)
    $ghGDIPDll = 0
    EndIf
    Return True
    EndFunc ;==>_GDIPlus_Shutdown

    [/autoit]

    Wie man sieht werden Zähler benutzt, um zu prüfen, ob bereits Startup/Shutdwn ausgeführt wurde.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Zusammenfassend:
    Also ist die Funktion von BugFix nicht notwendig.
    Ich werde den Hinweis in die Hilfe aufnehmen.

    Zitat

    Innerhalb der Funktion _GDIPlus_Startup wird automatisch geprüft, ob GDIPlus bereits gestartet ist.
    Somit wird verhindert, dass GDIPlus mehrfach gestartet wird.