LPWSTR nicht char aber wchar_t und dann?



  • 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?



  • berniebutt schrieb:

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

    War das auf mich bezogen?

    Martin Richter schrieb:

    Aber warum willst Du überhaupt nur mit C arbeiten?

    Wollen nicht, aber in der Uni müssen wir einige Aufgaben in C erledigen (Windowsprogrammierung).


Anmelden zum Antworten