LPWSTR nicht char aber wchar_t und dann?



  • Hi,

    also die Funktionen der WinAPI geben nicht char zurück (Zeiger) sondern LPWSTR.
    Konvertierung zu char geht nicht aber zu wchar_t. Nur kommt dann bei cout z.B. wo ein char verlangt wird nicht der Text von LPWSTR raus sondern eine Kette von Hexadezimalzahlen. Nun kann man ja wchar_t zu char konvertieren. Aber da wchar_t einfach mit [255] voher defeniert ist, bereitet mir ein Problem.

    Oder ist der weg ganz falsch den ich mache?



  • glaubst du bekommst noch eine antwort
    lass das programmieren doch einfach sein



  • unglaublich_aber_wahr schrieb:

    glaubst du bekommst noch eine antwort
    lass das programmieren doch einfach sein

    Ich habe hiermit eine Antwort bekommen du Subject.



  • 😃 nicht aber auf dein problem und darum gehts doch
    aber du bist ja beratungsresistent und weist alles besser warum fragst du dann noch.



  • hört sich danach an als hättest du UNICODE eingestellt. Mit Multi Byte in den Projekteinstellungen sollte es char* zurückgeben.
    Kommt natürlich auf die Funktion an. Wobei es auch wcout gibt...



  • lolor schrieb:

    😃 nicht aber auf dein problem und darum gehts doch
    aber du bist ja beratungsresistent und weist alles besser warum fragst du dann noch.

    Da du dich angesprochen fühlst heisst, dass du schuldig bist.



  • Melan schrieb:

    hört sich danach an als hättest du UNICODE eingestellt. Mit Multi Byte in den Projekteinstellungen sollte es char* zurückgeben.
    Kommt natürlich auf die Funktion an. Wobei es auch wcout gibt...

    Ja ich habe MS Visual C++ 9. Da ist defaul ANSI. Aber ich brobiere mal wcout aus. Danke.



  • Melan schrieb:

    hört sich danach an als hättest du UNICODE eingestellt. Mit Multi Byte in den Projekteinstellungen sollte es char* zurückgeben.
    Kommt natürlich auf die Funktion an. Wobei es auch wcout gibt...

    Ja, Danke! wcout funktioniert.



  • @Melan
    genau das hat man ja versucht ihm zu erklären
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-248245.html

    aber er will es ja nicht verstehn und meint das man ihn verarschen will und hat nur beleidigungen für einen übrig und spamt das ganze forum mit seinen hirnrissigen beleidigungen zu.



  • dududa schrieb:

    @Melan
    genau das hat man ja versucht ihm zu erklären
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-248245.html

    aber er will es ja nicht verstehn und meint das man ihn verarschen will und hat nur beleidigungen für einen übrig und spamt das ganze forum mit seinen hirnrissigen beleidigungen zu.

    Der Thread ist gelöst, falls du nicht lesen kannst.



  • wie kann eine Winapi funktion einen wchar_t pointer zurückliefern wenn du Multibyte Zeichensatz eingestellt hast? du nimmst doch wohl nicht direkt die W funktionen und beklagst dich das diese keinen char pointer zurückliefern.



  • Anderer Gast schrieb:

    wie kann eine Winapi funktion einen wchar_t pointer zurückliefern wenn du Multibyte Zeichensatz eingestellt hast? du nimmst doch wohl nicht direkt die W funktionen und beklagst dich das diese keinen char pointer zurückliefern.

    <table border="1" cellspacing="0" width="90%">
      <tbody>
    
        <tr align="left">
          <th bgcolor="#33ccff"><font color="#ffffff" face="Arial,Helvetica"
     size="-1">Bezeichnung</font></th>
          <th bgcolor="#33ccff"><font color="#ffffff" face="Arial,Helvetica"
     size="-1">in C / C++</font></th>
          <th bgcolor="#33ccff"><font color="#ffffff" face="Arial,Helvetica"
     size="-1">Bemerkung</font></th>
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">TRUE</font></b></td>
    
          <td><font face="Arial,Helvetica" size="-1">1, true</font></td>
          <td><font face="Arial,Helvetica" size="-1">&nbsp;</font></td>
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">FALSE</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">1, false</font></td>
          <td><font face="Arial,Helvetica" size="-1">&nbsp;</font></td>
    
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">NULL</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">0</font></td>
          <td><font face="Arial,Helvetica" size="-1">wird insbesondere
    f&uuml;r
    Pointer auf "Nichts" verwendet</font></td>
        </tr>
        <tr>
    
          <td><b><font face="Arial,Helvetica" size="-1">UINT</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">unsigned int</font></td>
          <td><font face="Arial,Helvetica" size="-1">16bit / 32bit</font></td>
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">BYTE</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">unsigned char</font></td>
    
          <td><font face="Arial,Helvetica" size="-1">&nbsp; 8bit</font></td>
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">WORD</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">unsigned short</font></td>
          <td><font face="Arial,Helvetica" size="-1">16bit</font></td>
    
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">DWORD</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">unsigned long</font></td>
          <td><font face="Arial,Helvetica" size="-1">32bit</font></td>
        </tr>
        <tr>
    
          <td><b><font face="Arial,Helvetica" size="-1">LONG</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">long</font></td>
          <td><font face="Arial,Helvetica" size="-1">32bit</font></td>
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">VOID</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">void</font></td>
    
          <td><font face="Arial,Helvetica" size="-1">z.B. als
    R&uuml;ckgabewert
    von Funktionen</font></td>
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">LPSTR</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">char*</font></td>
          <td><font face="Arial,Helvetica" size="-1">Pointer auf einen
    String
    (char-Array)</font></td>
    
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">LPCSTR</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">const char*</font></td>
          <td><font face="Arial,Helvetica" size="-1">Pointer</font><font
     face="Arial,Helvetica" size="-1">&nbsp;auf einen konstanten
    String&nbsp;</font><font face="Arial,Helvetica" size="-1">(char-Array)</font></td>
        </tr>
    
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">HANDLE</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">void*</font></td>
          <td><font face="Arial,Helvetica" size="-1">Handle f&uuml;r
    verschiedenste Windows-Elemente</font></td>
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">HWND</font></b></td>
    
          <td><font face="Arial,Helvetica" size="-1">-</font></td>
          <td><font face="Arial,Helvetica" size="-1">Handle eines Fensters</font></td>
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">PASCAL</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">pascal</font></td>
          <td><font face="Arial,Helvetica" size="-1">WINAPI = FAR PASCAL</font></td>
    
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">WPARAM</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">unsigned int</font></td>
          <td><font face="Arial,Helvetica" size="-1">16bit / 32bit</font></td>
        </tr>
        <tr>
    
          <td><b><font face="Arial,Helvetica" size="-1">LPARAM</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">long</font></td>
          <td><font face="Arial,Helvetica" size="-1">32bit</font></td>
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">LRESULT</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">long</font></td>
    
          <td><font face="Arial,Helvetica" size="-1">32bit</font></td>
        </tr>
        <tr>
          <td><b><font face="Arial,Helvetica" size="-1">HINSTANCE</font></b></td>
          <td><font face="Arial,Helvetica" size="-1">-</font></td>
          <td><font face="Arial,Helvetica" size="-1">Handle einer
    Instanz&nbsp;</font></td>
        </tr>
    
      </tbody>
    </table>
    


  • LiGERWooD schrieb:

    Melan schrieb:

    hört sich danach an als hättest du UNICODE eingestellt. Mit Multi Byte in den Projekteinstellungen sollte es char* zurückgeben.
    Kommt natürlich auf die Funktion an. Wobei es auch wcout gibt...

    Ja ich habe MS Visual C++ 9. Da ist defaul ANSI. Aber ich brobiere mal wcout aus. Danke.

    Das ist nicht korrekt, der default ist Unicode.
    Simon



  • Falls es noch jemanden interessiert, ich verwende perösnliche die beiden funktionen:

    /* char zu wchar_t */
    wchar_t* C2W(char* text)
    {
        size_t origsize = strlen(text) + 1;
        size_t convertedChars = 0;
        wchar_t* result = new wchar_t();
        mbstowcs_s(&convertedChars, result, origsize, text, _TRUNCATE);
    
    	return result;
    }
    
    /* wchar_t zu char* */
    char* W2C(wchar_t* text)
    {
    	// Convert to a char*
        size_t origsize = wcslen(text) + 1;
        size_t convertedChars = 0;
        char* result = new char();
        wcstombs_s(&convertedChars, result, origsize, text, _TRUNCATE);
    
    	return result;
    }
    

    Haben bis jetzt immer gut funktioniert. Falls aber jemand einen Fehler entdeckt kann er mir das ja mitteilen.



  • Melvin schrieb:

    Falls es noch jemanden interessiert, ich verwende perösnliche die beiden funktionen:

    /* char zu wchar_t */
    wchar_t* C2W(char* text)
    {
        size_t origsize = strlen(text) + 1;
        size_t convertedChars = 0;
        wchar_t* result = new wchar_t();
        mbstowcs_s(&convertedChars, result, origsize, text, _TRUNCATE);
    
    	return result;
    }
    
    /* wchar_t zu char* */
    char* W2C(wchar_t* text)
    {
    	// Convert to a char*
        size_t origsize = wcslen(text) + 1;
        size_t convertedChars = 0;
        char* result = new char();
        wcstombs_s(&convertedChars, result, origsize, text, _TRUNCATE);
    
    	return result;
    }
    

    Haben bis jetzt immer gut funktioniert. Falls aber jemand einen Fehler entdeckt kann er mir das ja mitteilen.

    Ein Punkt gefällt mir da gar nicht. Und zwar dass Du mit new Speicher allozierst und der Benutzer dieser Funktionen das wissen muss, um korrekt delete aufrufen zu könnnen.

    Packs entweder in eine Klasse oder verwenden std::string / std::wstring oder übergib den Buffer und die Länge einfach.

    Auch würde ich intern als Buffer std::vector und nicht mit new allozierten Speicher nehmen.

    Simon


  • Mod

    Warum verwendest Du nicht die Makros aus dem ATL, die das ganze weitaus intelliger macen?
    CA2W, A2W etc.



  • Melvin schrieb:

    Falls es noch jemanden interessiert, ich verwende perösnliche die beiden funktionen:

    /* char zu wchar_t */
    wchar_t* C2W(char* text)
    {
        size_t origsize = strlen(text) + 1;
        size_t convertedChars = 0;
        wchar_t* result = new wchar_t();
        mbstowcs_s(&convertedChars, result, origsize, text, _TRUNCATE);
    
    	return result;
    }
    
    /* wchar_t zu char* */
    char* W2C(wchar_t* text)
    {
    	// Convert to a char*
        size_t origsize = wcslen(text) + 1;
        size_t convertedChars = 0;
        char* result = new char();
        wcstombs_s(&convertedChars, result, origsize, text, _TRUNCATE);
    
    	return result;
    }
    

    Haben bis jetzt immer gut funktioniert. Falls aber jemand einen Fehler entdeckt kann er mir das ja mitteilen.

    Ein ganzen wchar_t für einen String du bist aber großzügig 😃 😉

    P.S. für char gilt das gleiche



  • Ich arbeite erst seit ein paar Monaten mit der Windows API und habe mich auch eher erst mit dieser beschäftigt als mit ATL und MFC. Die Einwände von theta sind natürlich berechtigt und werde das auch anpassen bzw. mir diese ATL Makros anschauen. Kann man die ATL eigentlich in einem C Projekt verwenden? Soweit wie ich das gelesen habe ist es eine C++ Bibliothek.


  • Mod

    Korrekt! Es ist eine C++ Bibliothek.
    Aber die alten A2W Makros funktionieren auch in C! Die neuen Makros CA2W etc. benutzen Klassen.

    Aber warum willst Du überhaupt nur mit C arbeiten?



  • Er denkt einfach nicht nach, liest auch keine Dokus, und wir sollen ihm dann bei jeder Kleinigkeit auf die Sprünge helfen. Wozu?


Anmelden zum Antworten