C++ String Variable in LPCTSTR

Sironardo

Cadet 4th Year
🎄Rätsel-Elite ’24
Registriert
Mai 2007
Beiträge
116
Hallo Leute,

sicher hört ihr die Frage realtiv oft aber ich weiß gerade nicht weiter :(

Ich lese in meinem Programm über eine externe Datei eine Zeichenfolge ein und speichere diese als string Variable. Später wird diese an eine Funktion übergeben, welche aber einen LPCTSTR erwartet... Ich kenn die Möglichkeit mit _T("..."), aber dort kann ich ja keine Variable reinsetzen :/


Beispiel:


string x = getStringFromFile("myFile.txt"); // string getStringFromFile(string filename)
function(x); //void function(LPCTSTR x)


Mit (LPCTSTR) myString.c_str() funktioniert es auch nicht -> const char* kann nicht in LPCTSTR konvertiert werden.
Leider kann ich den Zeichensatz nicht von UNICODE herunterstellen, da mir sonst eine externe lib/dll nicht mehr kompiliert werden will. Ich nutze MFC...

Hoffe ihr könnt mir weiterhelfen.
 
Hi,

ist die Datei die du ausliest Multibyte oder Widechar?

Wenn du eine Multibyte Datei hast, die du auch als Multibyte ausliest musst du die Zeichenfolge mit MultiByteToWideChar in UNICODE konvertieren bevor du weiter damit arbeitest.
 
Ist auf Mulitbyte gestellt...
 
Sironardo schrieb:
Ist auf Mulitbyte gestellt...

Hast du es mal mit schlzber's Vorschlag versucht? Link zur MSDN-Doku: http://msdn.microsoft.com/en-us/library/87zae4a3(v=VS.100).aspx

Beispiel:

Code:
#include <AtlBase.h>
#include <AtlConv.h>
#include <string>

void test()
{
    const std::string theString = "Bla bla";

    functionThatExpectsAn_LPCTSTR( CA2[B][COLOR="Red"]C[/COLOR][/B]T( theString.c_str() ) );
}

Wenn ich die Doku nicht falsch interpretiert habe, sollte das so funktionieren.
 
Zuletzt bearbeitet:
Das ist doch das Problem, er ließt die Zeichenfolge aus der Datei aus, damit ist es kein CONST und das Makro funktioniert nur auf CONST - von der von dir genannten Website: [C] is present when the destination type must be constant.

Suchst du was in der Richtung?
Code:
CFile file;
UINT uSize;
char* pBuffer = NULL;
CString sFile =_T("C:\\license.txt");
if(file.Open(sFile, CFile::modeRead))
{
	uSize		= (UINT) file.GetLength()+1;
	pBuffer		= new char[uSize];
	ZeroMemory(pBuffer, sizeof(char)*uSize);
	file.Read(pBuffer, uSize);
	file.Close();
}
TCHAR* pBufferW = new TCHAR[uSize];
ZeroMemory(pBufferW, sizeof(TCHAR)*uSize);
MultiByteToWideChar(CP_ACP, 0, pBuffer, uSize, pBufferW, uSize);
//jetzt mit pBufferW arbeiten...
delete pBuffer;
delete pBufferW;
 
Stimmt, ich habe das Beispiel korregiert. :o

EDIT: Stimmt zumindest teilweise. Das Problem war nicht, wo er die Zeichen herbekommt, sondern daß die Funktion einen LPCTSTR erwartet, CA2T aber einen LPTSTR liefert. CA2CT hingegen liefert den verlangten LPCTSTR.
 
Zuletzt bearbeitet:
Versteh ich nicht ganz: An Funktionen, die einen LPCTSTR als Parameter haben, kann man immer auch einen LPTSTR übergeben, da ein read/write buffer auch immer als readonly buffer betrachtet werden kann. Umgekehrt geht es nur nicht.

Und ansonsten gibt es für die Konvertierungsmakros wie schon erwähnt jeweils eine Version mit und eine ohne const im Typen/Namen.
 
schlzber schrieb:
An Funktionen, die einen LPCTSTR als Parameter haben, kann man immer auch einen LPTSTR übergeben, da ein read/write buffer auch immer als readonly buffer betrachtet werden kann.

Da hast du natürlich Recht. Allerdings kenne ich diese Konvertierungsmakros nur oberflächlich und wollte lieber auf Nummer sicher gehen, dehalb die Korrektur. CA2CT ist, wenn am Ende ein LPCTSTR raus kommen soll, auf keinen Fall verkehrt. Die Logik sagt, daß CA2T auch gehen sollte, da man, wie du schon sagtest, einen TCHAR* immer einem const TCHAR* zuweisen kann.

Unter Umständen könnte es dir andererseits passieren, daß eine Funktion mehrere Overloads bietet (einen für nicht-const Pointer und einen für const Pointer), und du dann am Ende einen Overload erwischt, der was völlig anderes tut, als du wolltest.
 
Zuletzt bearbeitet:
Zurück
Oben