LPTSTR vs. char* vs. wchar_t* [solved]



  • Also vom Prinzip klang die Sache ja ganz einfach, man nehme den String von argv[1], nehme den String von GetCurrentDirectory, vergleiche die ersten 4 Zeichen von beiden und führe dann einfach argv[1] aus.
    Witzige Sache ist, dass argv ursprünglich wchar_t* ist, GetCurrentDirectory einen LPTSTR zurückgibt und die beim Rumcasten am Schluss ich endweder völligen Müll (ungeschriebener Speicher oder nur den ersten Buchstaben) als String habe.

    #include <cstdlib>
    #ifdef _DEBUG
    #include <iostream>
    #endif
    #include <string>
    #include <windows.h>
    #include <wchar.h>
    #include "stdafx.h"
    
    using namespace std;
    
    int _tmain(int argc, LPTSTR **argv)
    {
    	if (argc > 1)
    	{
    		const int NCOMPCHARS = 4;
    		LPTSTR argCmp = new TCHAR[NCOMPCHARS];
    		LPTSTR curCmp = new TCHAR[NCOMPCHARS];
    
    		GetCurrentDirectory(NCOMPCHARS, curCmp);
    		curCmp[3] = 0;
    		wcscpy(argCmp, (LPCTSTR)argv[1]);
    
    		if (wcscmp(argCmp, curCmp) == 0)
    		{
    			cout<<(char *)argv<<endl;
    			system((char *)argv[1]);
    		}
    		else
    		{
    #ifdef _DEBUG
    			cout<<"Falsches Laufwerk"<<endl;
    			cout<<"'"<<(char *)argCmp<<"' '"<<(char *)curCmp<<"'"<<endl;
    #endif
    		}
    	}
    	else
    	{
    #ifdef _DEBUG
    		cout<<"Zu wenig Argumente"<<endl;
    #endif
    	}
    
    #ifdef _DEBUG
    	cout<<"Weiter mit Taste";
    	cin.get();
    #endif
    	return 0;
    }
    

    Das Programm gibt dann mit einem Parameter, der mit "C:\..." anfängt folgendes aus:
    Falsches Laufwerk
    'C' '══════'
    Weiter mit Taste

    Irgendwo haberts mit der Konvertierung, aber bei Unicode<->ANSI-Konvertierungen noch bei char*<->wchar_t*-Konvertierungen wurde ich fündig. Wie löst man so ein Problem am Besten? Dass das ganze in .NET gaaanz einfach wäre, ist mir auch klar. Aber es muss ohne gehen. MFC wäre auch noch Okay, aber weiß nicht, ob mir das was helfen würde. -

    PS: hab nun alles in wchar und konvertiere am Ende per WideCharToMultiByte().


Anmelden zum Antworten