[erledigt]SendMessageW und ein char-Array



  • Hi,

    ich hänge gerade an folgendem: Die Winamp-API bietet mit

    char title[100];
    
    sprintf(title, "%s", SendMessage(plugin.hwndParent,WM_WA_IPC, playlistPosition, IPC_GETPLAYLISTTITLE));
    

    die Möglichkeit, den Rückgabewert von SendMessage als char-Array zu speichern. Doch leider funktioniert das nicht, wenn Unicode-Zeichen vorkommen. Dann steht an der Stelle im Array nur ein Fragezeichen.

    Wie ist es nun möglich, das korrekte Zeichen in ein char-Array zu bekommen? SendMessageW funktioniert nicht, und ein "%ls" in sprintf auch nicht. Nun steh ich auf dem Schlauch.

    Danke für die Hilfe,
    Martin



  • Entweder du arbeitest grundsätzlich mit TCHAR (in der MSDN steht zu ziemlich jeder Standard-char*-Funktion auch ein UNICODE-Äquivalent) oder du verwendest explizit die ANSI-Version der WinAPI-Funktionen: SendMessageA().



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum C++ (auch C++0x) 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.



  • http://msdn.microsoft.com/en-us/library/ybk95axf(v=vs.71).aspx

    wchar_t title[100];
    swprintf(title, L"%s", SendMessage(plugin.hwndParent,WM_WA_IPC, playlistPosition, IPC_GETPLAYLISTTITLE));
    


  • @CStoll:
    In der MSDN steht

    typedef char TCHAR;
    

    ist es also nicht völlig egal, ob man char oder TCHAR verwendet?

    SendMessageA bringt immernoch diese Fragezeichen 😕

    @cooky451:
    Bei deinem Code meckert der Compiler, dass sprintf als Parameter 1 ein char* erwartet. Mit swprintf funktioniert es, doch dann bekomme ich keine char[]-Darstellung daraus. Folgendes führt nur zu einem einzigen Zeichen:

    wchar_t tmp[100];
    swprintf(tmp, L"%s", SendMessage(plugin.hwndParent,WM_WA_IPC, playlistPosition, IPC_GETPLAYLISTTITLE));
    
    char* ascii = new char[wcslen(tmp) + 1];
    wcstombs( ascii, tmp, wcslen(tmp) );
    


  • inspire schrieb:

    @CStoll:
    In der MSDN steht

    typedef char TCHAR;
    

    ist es also nicht völlig egal, ob man char oder TCHAR verwendet?

    Was sich hinter TCHAR verbirgt, hängt von deinen Projekteinstellungen ab - bei einem ANSI oder MULTIBYTE-Projekt ist es ein char, bei einem UNICODE-Projekt ist es ein wchar_t. Und das zu mischen kann mitunter in die Augen gehen.
    (btw, deine Meldung über SendMessageW sagt auch aus, daß du ein UNICODE-Projekt hast)

    PS: Bist du dir sicher, daß die WM_WA_IPC-Nachricht einen char-String zurückgibt?



  • Ah danke, in den Compilereinstellungen steht auch _UNICODE bzw UNICODE.

    In der Doku zum Winamp SDK steht:

    #define IPC_GETPLAYLISTTITLE 212
    #define IPC_GETPLAYLISTTITLEW 213
    /* (requires Winamp 2.04+, only usable from plug-ins (not external apps))
    ** char *name=SendMessage(hwnd_winamp,WM_WA_IPC,index,IPC_GETPLAYLISTTITLE);
    **
    ** IPC_GETPLAYLISTTITLE gets the title of the playlist entry [index].
    ** returns a pointer to it. returns NULL on error.
    */
    


  • Alles klar, habe es hinbekommen! Danke nochmal!


Anmelden zum Antworten