GDI+ Bild-Link dynamisch übergen.



  • Hallo liebe C++'er.
    Folgender Code ist mein Problem:

    {
    	MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, savedZeiger[1].ort, 260, dgm_ort_w, 0);
    	Graphics graphics(hdc);
    	graphics.DrawImage(Image::FromFile(dgm_ort_w), 0, 0);
    }
    

    Laut Compiler gibt es kein Problem.
    Über MultiByteToWideChar wird ein String in ein LPWSTR, der den Link zum Bild enthält und zuvor leicht umgeändert wurde (die "\" im Pfad wurden in "/" umgewandelt und die Direkteingabe L"D:\Test.bmp" in DrawImage funktioniert). Trotzdem wird bei der oben dargestellten, dynamischen Variante, kein Bild angezeigt.
    Ich weiß, dass das ein sehr knapper Codeschipsel ist und stelle gerne jedes weitere Material zur Verfügung. Allerdings fehlt mir momentan jegliche Idee, wo der Fehler liegen könnte. Also bei Code-Bedarf oder irgendwelchen Debug abfragen einfach melden...
    Grüße


  • Administrator

    1. Das hat nichts mehr mit C++ zu tun, sondern nur noch mit WinAPI. Wir haben dazu ein eigenes Forum 😉
    2. Ich bin mir nicht sicher, ob die WinAPI Pfadangaben per '/' aktzeptiert. Auf Windows arbeitet man normalerweise mit dem Backslash.
    3. Ws ist dgm_ort_w ? Ist der Puffer gross genug?
    4. Rückgabewert der Funktion MultiByteToWideChar prüfen!
    6. Hast du schon mal überprüft, was am Ende im Puffer dgm_ort_w drinsteht?
    7. (Edit) Gerade noch gesehen, der letzte Parameter von MultiByteToWideChar ist ja 0. Dann wird gar keine Konvertierung vorgenommen, sondern nur ausgerechnet, wie gross der wchar_t Puffer sein muss.

    Grüssli



  • Dravere schrieb:

    2. Ich bin mir nicht sicher, ob die WinAPI Pfadangaben per '/' aktzeptiert. Auf Windows arbeitet man normalerweise mit dem Backslash.

    ich hatte bisher noch nie probleme damit ;o)

    und die konsole etc akzeptiert es ja auch - also fällt mir auch kein grund ein, wieso es da probleme geben sollte...

    bb


  • Administrator

    unskilled schrieb:

    Dravere schrieb:

    2. Ich bin mir nicht sicher, ob die WinAPI Pfadangaben per '/' aktzeptiert. Auf Windows arbeitet man normalerweise mit dem Backslash.

    ich hatte bisher noch nie probleme damit ;o)

    und die konsole etc akzeptiert es ja auch - also fällt mir auch kein grund ein, wieso es da probleme geben sollte...

    Weil Windows standardmässig den Backslash verwendet. Gerade in der Konsole kann es Probleme geben. Öffne mal eine Konsole, gehe auf deine Windowspartition und dann verwende dir , um dir den Windows Ordner anzuzeigen:

    C:\>dir ./windows
    Parameter format not correct - "windows".
    
    C:\>dir .\windows
     Volume in drive C is Windows disk
     Volume Serial Number is 5091-B013
    
     Directory of C:\windows
    
    ...
    

    Auf Windows wenn möglich immer den Backslash in Pfadangaben verwenden. Der Slash von Unix wird zum Teil auch auf Windows aktzeptiert, aber soweit mir bekannt ist, gibt es keine wirkliche Garantie.

    Grüssli



  • Hallo,
    um die Fragen abzuarbeiten:
    zu 1: 🙄
    zu 2: Die WinApi akzeptiert (in meinem Fall) die "/". Ich habe es durch direkteingabe versucht. Vll. sollte man es auf dauer ändern, allerdings zeigt es ja für den Moment, dass der Fehler nicht hier liegt.
    zu 3: dgm_ort_w ist ein LPWSTR. Mit diesem Datentyp scheint DrawImage zurecht zu kokmmen. Mit anderen hatte ich Probleme. Könnte da der Fehler liegen?
    zu 4: Wenn ich im Direktfenster ?MultiByteToWideChar() eingebe, kommt:
    Fehler: Die Überprüfung der Funktion "MultiByteToWideChar" wurde abgebrochen.
    Stellt sich für mich die Frage, ob der Fehler in meiner Abfrageart liegt, oder ob mein generelles Problem in dieser Funktion liegt.
    zu 5: Du has eine Zahl übersprungen :p
    zu 6: dgm_ort_w bleibt leer, ein weiterer Hinweis darauf, dass der Fehler in MultiByte... steht.
    zu 7: Das war mir gestern Abend auch noch aufgefallen und ich habe es geändert.
    Grüße



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Administrator

    FlashMuller schrieb:

    zu 1: 🙄

    Musst du nicht die Augen verdrehen. Es ist nur sinnvoll für dich, im richtigen Forum zu posten, da du im richtigen Forum auch die beste Hilfe bekommst 😉

    FlashMuller schrieb:

    zu 3: dgm_ort_w ist ein LPWSTR. Mit diesem Datentyp scheint DrawImage zurecht zu kokmmen. Mit anderen hatte ich Probleme. Könnte da der Fehler liegen?

    LPWSTR ist aber nur ein Zeiger. Du musst schon einen Puffer anlegen, sonst rennst du in undefiniertes Verhalten rein.

    FlashMuller schrieb:

    zu 4: Wenn ich im Direktfenster ?MultiByteToWideChar() eingebe, kommt:
    Fehler: Die Überprüfung der Funktion "MultiByteToWideChar" wurde abgebrochen.
    Stellt sich für mich die Frage, ob der Fehler in meiner Abfrageart liegt, oder ob mein generelles Problem in dieser Funktion liegt.

    So überprüft man aber nicht den Rückgabewert einer Funktion. Wie kommst du überhaupt auf die Idee, dies so zu machen? Das macht man im Code und prüft mit einer if-Anweisung danach, ob der zurückgegeben Wert dem entspricht, was man erwartet hat. MultiByteToWideChar ist eine WinAPI C Funktion, die Fehlermeldungen kommen da als Rückgabewerte zurück.

    FlashMuller schrieb:

    zu 5: Du has eine Zahl übersprungen :p

    ... ups 😃

    Hmmm, ich glaube, ich zeige am Besten mal schnell ein Beispiel:

    #include <windows.h>
    
    #include <iostream>
    
    int main()
    {
        char const* text = "C:\\Hallo\\Welt.jpg";
    
        // Zuerst ermitteln wir die benötigte Puffergrösse:
        int size = MultiByteToWideChar(CP_THREAD_ACP, 0, text, -1, NULL, 0);
    
        if(!size)
        {
            std::cout << "Error, Code: " << GetLastError() << std::endl;
            return 1;
        }
    
        // Wir erstellen den Puffer:
        wchar_t* buffer = new wchar_t[size];
    
        // Nun konvergieren wir die Sache wirklich:
        size = MultiByteToWideChar(CP_THREAD_ACP, 0, text, -1, buffer, size);
    
        if(!size)
        {
            std::cout << "Error, Code: " << GetLastError() << std::endl;
            return 2;
        }
    
        // Wir zeigen den Text an:
        std::wcout << buffer << std::endl;
    
        // Wir geben den Puffer frei:
        delete[] buffer;
    
        return 0;
    }
    

    Wie die Errorcodes zu interpretieren sind, entnimmst du der Dokumentation von MultiByteToWideChar .

    Grüssli



  • Der 🙄 Smiley, war als "Hupps" gedacht, nicht als "Nerv nit". Das nur um mich zu erklären ^^

    Und das zweite:
    Vielen vielen vielen vielen Dank. Ich habe es meinen Bedürfnissen angepasst und es funktioniert hervorragend. Ich hoffe mal, dass dieser Thread gut in Google plaziert wird, denn so verzweifelt wie ich bisher gesucht hatte, wird dein Codeschnipsel vermutlich noch vielen weiteren Helfen. 👍
    In diesem Sinne noch einmal vielen Dank und Grüße


Log in to reply