C-String in einen LPCWSTR konvertieren



  • bei der WinAPI gibts ja, wie ich gerade festgestellt hab, sehr viele versch. datentypen für strings, alle dann auch noch als const und jede klasse/funktion braucht irgendwelche anderen... ich hab mich mal in der msdn umgeschaut und den atl header gefunden. zuerst mal: bin ich da bei der richtigen adresse gelandet? jetzt versuche ich den header mittels #include <atl/atlconv.h> einzubinden, erhalte aber immer folgenden fehler:

    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atl\atlconv.h(18) : fatal error C1083: Datei (Include) kann nicht geöffnet werden: "atldef.h": No such file or directory

    man beachte dass hinten ein anderer dateiname steht als den, den ich eigentlich einbinden wollte.



  • jimmy3 schrieb:

    man beachte dass hinten ein anderer dateiname steht als den, den ich eigentlich einbinden wollte.

    das ist nichts ungewöhnliches, wenn eine 'include'-datei andere dateien #includieren will.



  • also um nochmal zur ersten frage zu kommen: ist das denn so überhaupt die richtige lösung mit diesen Makros oder gibts da nicht was einfacheres wie TEXT(quote)?
    @vista: stimmt, danke, hätt ich auch drauf kommen können 😃 . in atlconv.h steht #include <atlbase.h> was relativ zum include pfad natürlich nicht stimmt. hab ich da was in einen falschen ordner kopiert oder ist da einfach die pfadangabe falsch (entsprechend durch umändern in #include <atl\altbase.h> könnte mans ändern aber das müsste ich dann ja bei allen atl's machen)?



  • Die meisten WinAPI-Funktionen (Ich zähle mal COM-Zeugs und so nicht dazu) gibt es sowohl als ANSI-Funktion als auch als Unicode-Funktion.

    z.B. existiert GetWindowText() als GetWindowTextA() und GetWindowTextW()
    Je nachdem ob das UNICODE-Makro definiert ist, wird aus den WinAPI-Headern die jeweilige Version ausgesucht (wenn man es nicht selbst macht)

    Einige Dinge wie GDI+ können nur noch Unicode.
    Windows NT, 2000, XP, Vista verwendet intern nur Unicode. (GetWindowTextA() ist da quasi ne Dummy-Funktion)

    Umwandeln von Ansi nach Unicode:
    http://support.microsoft.com/?scid=kb%3Ben-us%3B138813&x=14&y=10

    Vermutlich auch interessant:
    http://www.flounder.com/cstring.htm#Unicode and CStrings



  • ich habs gerade nochmal mit hilfe von atl versucht und einfach alle dateien von include\atl in include kopiert aber was dabei rauskam war dann eine fehlermeldung die 37 neue fehler umfasste, vor allem kam ~20 mal

    "_ASSERTE": Bezeichner wurde nicht gefunden.

    was mache ich denn falsch?



  • #include <crtdbg.h> hat das problem vorerst mal behoben, da ist _ASSERTE nämlich definiert jetzt ist nur noch das übrig geblieben:

    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(701) : error C2275: 'DEVMODEW': Ungültige Verwendung dieses Typs als Ausdruck
    1> C:\Programme\Microsoft Visual Studio 8\VC\include\wingdi.h(1982): Siehe Deklaration von 'DEVMODEW'
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(701) : error C2065: 'dmFormName': nichtdeklarierter Bezeichner
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(701) : error C2275: 'DEVMODEW': Ungültige Verwendung dieses Typs als Ausdruck
    1> C:\Programme\Microsoft Visual Studio 8\VC\include\wingdi.h(1982): Siehe Deklaration von 'DEVMODEW'
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(701) : error C2065: 'dmSpecVersion': nichtdeklarierter Bezeichner
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(701) : error C3861: "offsetof": Bezeichner wurde nicht gefunden.
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(701) : error C3861: "offsetof": Bezeichner wurde nicht gefunden.
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(704) : error C2275: 'DEVMODEW': Ungültige Verwendung dieses Typs als Ausdruck
    1> C:\Programme\Microsoft Visual Studio 8\VC\include\wingdi.h(1982): Siehe Deklaration von 'DEVMODEW'
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(704) : error C2065: 'dmLogPixels': nichtdeklarierter Bezeichner
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(704) : error C3861: "offsetof": Bezeichner wurde nicht gefunden.
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(900) : error C2275: 'DEVMODEA': Ungültige Verwendung dieses Typs als Ausdruck
    1> C:\Programme\Microsoft Visual Studio 8\VC\include\wingdi.h(1928): Siehe Deklaration von 'DEVMODEA'
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(900) : error C2275: 'DEVMODEA': Ungültige Verwendung dieses Typs als Ausdruck
    1> C:\Programme\Microsoft Visual Studio 8\VC\include\wingdi.h(1928): Siehe Deklaration von 'DEVMODEA'
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(900) : error C3861: "offsetof": Bezeichner wurde nicht gefunden.
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(900) : error C3861: "offsetof": Bezeichner wurde nicht gefunden.
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(903) : error C2275: 'DEVMODEA': Ungültige Verwendung dieses Typs als Ausdruck
    1> C:\Programme\Microsoft Visual Studio 8\VC\include\wingdi.h(1928): Siehe Deklaration von 'DEVMODEA'
    1>C:\Programme\Microsoft Visual Studio 8\VC\include\atlconv.h(903) : error C3861: "offsetof": Bezeichner wurde nicht gefunden.

    👎
    selten sonen müll gesehn



  • ich will doch nur eine LPCSTR in eine LPCWSTR konvertieren, ist das nicht ein alltägliches WinApi problem???
    kennt da keine eine antwort drauf? 😞



  • Das ist kein Problem ...

    char array_char[128];
    _snprintf(array_char, 128, "Das ist ein Test ..."); 
    // Also der String den du in WideChar haben willst ...
    
    wchar_t* item = new wchar_t[string.length() + 1]; 
    if (!MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, array_char, static_cast<int>(strlen(array_char) + 1), item, sizeof(item) / sizeof(item[0])))
    {
    	delete [] item;
    	return false;
    }
    
    // Jetzt steht in item dein Text drin ...
    // am ende wieder freigeben ...
    delete [] item;
    

    aja ..

    bool c_to_wc(const std::string& string, std::wstring& dest)
    {
    	wchar_t* item = new wchar_t[string.length() + 1]; 
    	if (!MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, string.c_str(), static_cast<int>(string.length() + 1), item, sizeof(item) / sizeof(item[0])))
    	{
    		dest = L"";
    		delete [] item;
    		return false;
    	}
    
    	dest = item;
    	delete [] item;
    	return true;
    }
    

    😉



  • sowas hab ich gesucht, vielen dank!
    ich werds gleich mal ausprobieren 🙂


Anmelden zum Antworten