Variablen nach LPCTSTR casten



  • Hallo

    Ich danke Euch schon mal im voraus fürs helfen.

    Ich stosse immer wieder auf das selbe Problem, wie caste ich einen string oder char oder was auch immer zu einem LPCTSTR.

    Natürlich könnte ich den Zeichensatz auf Multi-Byte-Zeichensatz wechseln, aber Unicode ist im wesentlicheren Sinn besser, wenn man sein Programm auf verschiedenen XP PC's mit anderen Zeichensatz laufen lassen möchte.

    Oder versteh ich da etwas falsch?

    Nun wenn ich jetzt zum beispiel ein char[] oder ein string oder sonst was habe, wie cast ich das am besten zu einem LPCTSTR?

    ich habe schon das gesehen, aber das gibt bei mir irgend ein pseudo Text aus:

    int len = MultiByteToWideChar(CP_ACP, 0, "variable", 0, NULL, 0);
    g_lpwFps = (LPWSTR)malloc(len);
    MultiByteToWideChar(CP_ACP, 0, g_cfps, 1, g_lpwFps, len)

    Einige Beispiele:

    Ich würde eben gerne ein SendMessage ausgeben in einem Edit-Feld...darum frage ich.

    SendMessage(g_hwndEdit, WM_SETTEXT, 0, (LPARAM)test.c_str());
    

    Nur das Funktioniert leider nicht, nur wenn ich TEXT("test") oder L"test" mache...

    Könnt Ihr mir weiterhelfen, wie ich dieses Problem am besten lösen könnte und ob mein Gedanke stimmt, das Unicode im wesentlicheren Sinn besser ist..

    Danke nochmals.

    Gruess

    Manu



  • du solltest statt char TCHAR verwenden und vor Strings
    immer ein TEXT("") davor setzten.
    Dass Unicode besser als Multi Byte ist, kann man so nicht sagen.
    Mit UNICODE kann man zwar auch asiatische Zeichen usw. darstellen,
    jedoch laufen UNICODE Programme nicht auf Windows 95/98 und benutzen für jedes
    Zeichen 2 Bytes.



  • wie meinst du das mit Text("") vor den string setzen?

    etwa so:

    std::string test = "test";
    SendMessage(HWND, WM..., 0, (LPARAM)TEXT("")test);
    

    oder wie? :S



  • ich bin jetzt eigentlich davon ausgegangen, dass du C Strings benutzt also

    TCHAR text[100] = TEXT("STRING");
    

    dieses text könntest du dann verwenden ohne es noch umzuwandeln.
    Wenn du std::string verwendest und UNICODE solltest du wstring benutzen,
    also etwa so:

    std::wstring text = TEXT("STRING");
    

    dann könntest du es mit text.c_str() verwenden.



  • So ist es aber nicht dynamisch..

    Wenn man im TEXT(Variable) machen würde, gibts ein Fehler, da der Compiler dann die Variable nicht mehr erkennt.. Die Variable heisst ja dann LVariable...

    Hast du noch ne andere Variante?



  • Du sollst ja dem TEXT Makro keine Variablen übergeben, sondern Strings.
    Und falls du Variablen meinst, zum übergeben an Funktionen,
    da brauchst du TEXT nicht, denn wenn du die Variable mit TEXT initialisiert hast, kommt da auch kein Fehler.
    Du könntest gerne ein Code Beispiel posten wenn du willst.



  • Ich werde morgen früh Code posten, wenn ich auf der Arbeit bin...

    Du kannst dir, dass in etwas so vorstellen...

    1 Beispiel:

    Ich habe eine COPYDATASTRUCT Struktur mit einem lparam, welcher aber auch umgewandelt werden muss, ansonsten wird er falsch oder gar nicht angezeigt auf dem Textfeld, teils stürzt er sogar ab!

    2 Beispiel:

    Ich habe einen int für die FPS berechnung und den möchte ich jetzt anzeigen... Das geschieht über eine DirectX Funktion, welche ein LPCTSTR verlangt... und wenn ich das so konventiere via "MultiByteToWideChar" zeigts nur so pseudo zeugs an...

    Code folgt morgen früh gegen 8.00 . 🙂

    Ich denke ich werd das eigentlich nie brauchen, aber nice to know ^^

    Du würdest mir gar empfehlen auf Multi-Byte-Zeichensatz zu wechseln?



  • Hier der Code:

    1 Beispiel

    Hier wird alles nur weitergeleitet..(Habe ich nur zur Verständnis gepostet)

    LRESULT CALLBACK fnMyCallBack(int nCode, WPARAM wParam, LPARAM lParam)
    {
    COPYDATASTRUCT		CDS;
    	HEVENT				Event;
    CDS.dwData = 0;
    	CDS.cbData = sizeof(Event);
    	CDS.lpData = &Event;
    
    	Event.nCode			= nCode;
    	Event.wParam		= wParam;
    	Event.lParam		= lParam;
    	Event.dwHookType	= WH_KEYBOARD;
    
    SendMessage(g_hWnd, WM_COPYDATA, 0, (LPARAM)&CDS);
    
    ..
    }
    

    Hier wird es wieder empfangen und probiert zu casten...

    case WM_COPYDATA:
    			HEVENT				Event;
    			COPYDATASTRUCT* CDS = (COPYDATASTRUCT*)(lParam);
    
    			if( CDS->cbData==sizeof(HEVENT) && ((HEVENT*)CDS->lpData)->dwHookType == WH_KEYBOARD)
    			{
    				memcpy(&Event, (HEVENT*)CDS->lpData, sizeof(HEVENT)); 
    
    				int chch = 0;
    
    				chch = MapVirtualKey((0xFF0000&Event.lParam)>>16, 1);
    
    				std::string penis = "penis";
    
    				SendMessage(g_hwndEdit, WM_SETTEXT, 0, (LPARAM)penis.c_str());
    			}
    

    Beim 2 Beispiel sieht es so aus:

    int getFPS() <-- gibt die FPS anzahl zurück und hier wird es eingefügt und probiert zu casten

    g_pD3DFont->DrawText(NULL, (LPCTSTR)g_cfps, -1, &g_rFontPosition, DT_LEFT, 0xff0000ff);
    

    ich hoff das hilft dir weiter.. um mir zu helfen

    Danke nochmals..



  • Hallo,

    für beide Fälle: Hast du daran gedacht, die Werte (beide sind numerisch, für den ersten Fall klar, weil MapVirtualKey einen UINT zurück gibt, im zweiten Fall wegen getFPS, welche ein int liefert) zunächst in Zeichenketten umzuwandeln, bevor du überhaupt an Funktionen übergibst, die Zeichenketten erwarten? Ein simpler Cast reicht hier nicht, denn diese Funktionen wollen ein Nullbyte (oder zwei, wenn UNICODE) als Abschluss sehen, was ein Cast natürlich nicht leisten kann.

    MfG,

    Probe-Nutzer



  • ja das ist mir schon klar, ich wandle bei in eine Zeichenketten um..

    darum auch g_cFps .. das c vor Fps bedeutet char.. 🙂

    aber was meinst du mit:

    Ein simpler Cast reicht hier nicht, denn diese Funktionen wollen ein Nullbyte (oder zwei, wenn UNICODE) als Abschluss sehen, was ein Cast natürlich nicht leisten kann.



  • ja das ist mir schon klar, ich wandle bei in eine Zeichenketten um..

    Da es im Code nicht zu sehen war, und alle Mal eine Absturzursache ist, nahm ich an, dass dies das Problem sein könnte.

    darum auch g_cFps .. das c vor Fps bedeutet char.. 🙂

    Und ich dachte natürlich c für count 🙂

    mRXXo schrieb:

    aber was meinst du mit:

    Ein simpler Cast reicht hier nicht, denn diese Funktionen wollen ein Nullbyte (oder zwei, wenn UNICODE) als Abschluss sehen, was ein Cast natürlich nicht leisten kann.

    DrawText und SendMessage benötigen nullterminierte Zeichenketten, die man eben erhält, wenn man vorher die numerischen Werte in Zeichenketten umwandelt, und dann erst die so erhaltenen Zeichenketten nach LPARAM bzw. LPCTSTR castet.

    Einen anderen Fehler sehe ich nicht, kannst du also zeigen, wie du die Umwandlung machst?

    MfG,

    Probe-Nutzer



  • Probe-Nutzer schrieb:

    DrawText und SendMessage benötigen nullterminierte Zeichenketten, die man eben erhält, wenn man vorher die numerischen Werte in Zeichenketten umwandelt, und dann erst die so erhaltenen Zeichenketten nach LPARAM bzw. LPCTSTR castet.

    Probe-Nutzer

    Nicht unbedingt. Man kann als Parameter bei DrawText
    die Anzahl der Zeichen angeben. DrawText benutzt nur nullterminierte Zeichenketten, wenn man -1 einträgt.



  • Ich habe SendMessage ersetzt, da es mit PostMessage ohne Probleme läuft.

    Siehe da:

    HEVENT				Event;
    			COPYDATASTRUCT* CDS = (COPYDATASTRUCT*)(lParam);
    
    			if( CDS->cbData==sizeof(HEVENT) && ((HEVENT*)CDS->lpData)->dwHookType == WH_KEYBOARD)
    			{
    				memcpy(&Event, (HEVENT*)CDS->lpData, sizeof(HEVENT)); 
    				bool m_bCheck = (((DWORD)KF_UP<<16)&Event.lParam)!=0;
    				::PostMessage(g_hwndEdit, m_bCheck?WM_KEYDOWN:WM_KEYUP, Event.wParam, Event.lParam);			
    			}
    

    Natürlich nicht die beste Lösung, aber es läuft so.. 🙂

    aber das mit em DrawText krieg ich nicht hin..

    mein g_cfps habe ich so probiert zu casten..

    int len = MultiByteToWideChar(CP_ACP, 0, g_cfps, 0, NULL, 0);
    		g_lpwFps = (LPWSTR)malloc(len);
    		MultiByteToWideChar(CP_ACP, 0, g_cfps, 1, g_lpwFps, len);
    

    die draw methode:

    g_pD3DFont->DrawText(NULL, g_lpwFps , -1, &g_rFontPosition, DT_LEFT, 0xff0000ff);
    

    Aber wie man auf dem Bild sehen kann, gibt es komische Zeichen aus...

    http://img178.imageshack.us/my.php?image=ausgabefp4.jpg

    Edit:

    Ich habe gerade gelesen, dass ich -1 habe... also wenn ich 0 oder halt was anderes nehme, kann ich normale wstring oder int benutzen?


Anmelden zum Antworten