_GDIPlus_BitmapCreateFromHBITMAP() WIN32Error auf Server-OS

  • Hallo liebe Community, ich versuche gerade ein kleines Programm zu scripten, welches mir Bilder zentriert auf einen durch mich definierten Hintergrund ablegt und neu abspeichert. Das Programm ist soweit auch fertig, jedoch habe ich ein Problem, an dem ich zur Zeit einfach nicht weiter komme.

    Als erstes starte ich die GDI+ Library mit

    [autoit]

    _GDIPlus_Startup()

    [/autoit]

    danach erzeuge ich ein Bitmap und lasse mir dessen Handle geben:

    [autoit]

    $hBlankImage = _WinAPI_CreateBitmap($pxX, $pxY, 1, 32)

    [/autoit]

    als nächstes erstelle ich aus dem Bitmap-Handle ein Bitmap-Objekt um den horizontalen und vertikalen DPI-Wert des blanko Bildes an das Quellbild anzupassen:

    [autoit]

    $oImage = _GDIPlus_BitmapCreateFromHBITMAP($hBlankImage)

    [/autoit]

    . Genau hier funktioniert es dann nicht mehr. Jedoch nur auf Servern. Ich habe folgende getestet: Win 2003 Std, Win 2003R2 Std, Win 2008 Std, Win 2008 R2 Datacenter. Auf all diesen Systemen bekomme ich von GDI+ den Errorwert 7 zurück, welcher für Win32Error laut MS steht.

    Auf Win XP, Vista, Win7 egal ob 64 oder 32 bit, funktioniert das problemlos. Hat jemand von euch evtl noch einen Tip?

    Gruß
    Cele

    ~ Nachtrag ~

    Ich konnte jetzt das Problem "lösen". Nachdem ich die Farbtiefe des Bitmaps auf 16bit herabgesetzt habe, hat dies auf einmal auf den Servern funktioniert.

    [autoit]

    $hBlankImage = _WinAPI_CreateBitmap($pxX, $pxY, 1, 16)

    [/autoit]

    Jedoch bleibt die Frage, warum das mit 24bit oder 32bit nicht funktioniert. Bei diesen Einstellungen bekomme ich jeweils Win32Error zurück. Ich dachte evtl. an die Verbindung, da ich mich per RDP auf die Server verbinde jedoch auch wenn die Sitzung mit 32bit läuft, erscheint dieser Fehler. Ich kenne mich in diesem Bereich nicht so aus aber liegt hier das Problem evtl. bei der Grafikkarte? Wird die im Zusammenhang mit GDI+ verwendet?

    Gruß
    Cele


    ~ Nachtrag #2 ~

    Ok - nun habe ich wieder ein Problem... Die Idee für dieses Programm war, es durch einen Job automatisch laufen zu lassen und die Bilder entsprechend unseren Vorgaben neu zu erstellen, sodass diese richtig dargestellt werden.

    Nachdem nun durch die herabsetzung der Farbtiefe mein erstes Problem sich lösen ließ, bin ich jetzt auf ein zweites getoßen, was wohl in die gleiche Kerbe schlägt wie auch das erste Problem. Da dies ja als automatischer Job laufen soll, habe ich diesen einmal eingerichtet und mich vom Server abgemeldet. Nun habe ich wieder das gleiche Trauerspiel. Die Bilder, die er anpassen sollte, wurden nicht verändert, bzw. nicht im Zielverzeichnis abgespeichert.

    Muss für GDI+ Funktionen eine aktive Benutzersitzung bestehen? Weil das ist ja nicht sonderlich hilfreich, wenn ein Benutzer diesen Job immer ausführen muss, damit die Bilder angepasst werden -.-

    6 Mal editiert, zuletzt von Celestin (14. Juli 2011 um 20:52)

  • Moin,

    danke schon einmal für deine Antwort, jedoch als Dienst soll es ja nicht laufen. Dafür war es auch nie vorgesehen.
    Ich richte einen Geplanten-Task ein, der dann das Programm ausführt. Sozusagen drückt der Windows-Scheduler für mich auf "Ausführen".

    Nur hier haben wir das Problem. Sobald der Windows-Scheduler die EXE aufruft, scheint die Funktion nicht mehr zu funktionieren. Selbst, wenn ich angemeldet bin und per Hand den Job starte. Nur wenn ich über den Explorer die EXE per doppelklick aufrufe, läuft es ohne Probleme durch.

    Wo ist hier nun der große Unterschied? Doppelklick im Explorer vs. automatischer Aufruf durch den Windows-Scheduler?

    Und warum funktioniert es mit 24, 32bit nicht obwohl dies auf XP, Vista, Win7 ohne Probleme läuft?

    Ich werde mal einen Job auf einer Workstation einrichten und gucken, wie es sich dabei verhällt.

    PS:
    Ja der Windows-Scheduler ruft die EXE mit maximalen Rechten auf und läuft auch unabhängig der Benutzeranmeldung.

    Einmal editiert, zuletzt von Celestin (13. Juli 2011 um 16:30)

  • Jop, der Ausführungspfad ist der, indem das Programm liegt. Sollte ja aber eigentlich keine Rolle spielen, da ich in dem Programm mit

    [autoit]

    @ScriptDir

    [/autoit]

    arbeite.

    Die Funktion

    [autoit]

    _GDIPlus_BitmapCreateFromHBITMAP()

    [/autoit]

    halte ich hier für den wahren Schuldigen da mir diese Funktion ja davor schon Win32Errors um die Ohren gehauen hat. Leider bekam ich mit

    [autoit]

    _WinAPI_GetLastErrorMessage()

    [/autoit]

    auch keine bessere Fehlerbeschreibung. Nur, dass es keine Fehler geben würde xD"

  • Die Farbtiefe hatte ich auch schon einmal umgestellt jedoch ohne großen erfolg. Bislang funktioniert es halt wirklich nur mit 16bit.

    Allerdings auch nur, wenn ich die EXE per Doppelklick startet. Wenn ich jedoch angemeldet bin, mit der gleichen Sitzung, in der es per Doppelklick funktioniert hatte, und ich jetzt per Hand den Windows-Scheduler startet, bearbeitet er die Bilde nicht. Das Programm wird aber ausgeführt. Da es unterschiedliche Bilder bearbeiten muss und dazwischen sind auch welche, die er nicht verändert, sondern unverändert im Ziel mit ablegt. Diese unveränderten Bilder tauchen nach dem Ablauf auch auf. Nur die Bilder, die er bearbeiten sollte, erscheinen nicht.

    Ich habe hier die Fehlermeldungen mir noch nicht weiter anzeigen lassen, jedoch wird es wohl das gleiche sein, wie auch schon im ersten Post geschildert.

    Folgendes steht also noch aus:

    • EXE mit dem Windows-Scheduler in einer Workstation testen
    • Fehlerausgabe aktivieren um im Aufruf vom Windows-Scheduler mehr herauszufinden.

    Bin offen für weitere Ansätze / Lösungen :D

    Gruß
    Cele

    ~ Nachtrag ~

    Also kommen wir erst einmal zur Workstation Win 7 Pro 32bit

    • Der Task wird mit "Nur ausführen, wenn Benutzer angemeldet ist" erfolgreich ausgeführt.
    • Der Task wird mit "Unabhängig von der benutzeranmeldung ausführen" erfolgreich ausgeführt.

    Server 2008 R2 Datacenter 64bit

    • Der Task wird mit "Nur ausführen, wenn Benutzer angemeldet ist" erfolgreich ausgeführt.
    • Der Task wird mit "Unabhängig von der benutzeranmeldung ausführen" nicht ausgeführt.

    Hier haben wir wieder Error-Code 7 = Win32Error

    Solangsam nervt es... Naja, vielleicht hat ja noch jemand eine Idee. Ansonsten muss das Programm erst einmal mit einer gesperrten Sitzung arbeiten. Bin ich zwar kein Fan von aber immer noch besser als von Hand immer drauf zu drücken.

    ~ Nachtrag ~

    Nach meinen ganzen tests zu urteilen, steht diese Funktion zum Benutzerkontext und kann auch nur unter diesem aufgerufen werden. Anders kann ich mir das nicht erklären. Evtl. weiß ja jemand einen anderen Weg, den ich gehen kann.

    Kurz zu dem, was ich brauche:

    Ich habe ein Quellbild mit einer Auflösung von 200x200 Pixeln und 150dpi (die Auflösungen und DPI-Werte sind variabel und nicht fix. Die Bilder sind jedoch nie größer als 340x256 Pixel).
    Dieses Quellbild soll auf einen weißen Hintergrund zentriert abgelegt werden. Der Hintergrund hat die Maße 340x256 Pixel und muss die DPI des Quellbildes annehmen, da das Bild sonst zu groß oder zu klein abgebildet wird.

    Das ganze soll als Automatischer Job laufen ohne Benutzeranmeldung.

    Gruß
    Cele

    ~ Nachtrag ~

    Da diese Funktion wie schon davor beschrieben von der Benutzeranmeldung abzuhängen scheint, habe ich nun einen anderen Weg versucht zu nehmen und bin nun letztendlich hier angekommen. Eine GUI zu erzeugen und diese als Referenz zu benutzen um daraus ein Bitmap-Objekt zu erstellen:

    [autoit]

    $hBlankImage = GUICreate("", $pxX, $pxY)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hBlankImage)
    $oImage = _GDIPlus_BitmapCreateFromGraphics($pxX, $pxY, $hGraphic)

    [/autoit]


    Dies scheint zu funktionieren! Endlich!

    Gruß
    Cele

    3 Mal editiert, zuletzt von Celestin (14. Juli 2011 um 20:48)

  • Ah ok!

    Werde ich dann bei Gelegenheit auch mal testen. Danke - warum muss das immer alles so kompliziert sein? :D