Problem mit 'LPCWSTR'



  • Hi,

    ich habe ein problem mit einer funktion die in argument 1 ein LPCWSTR benötigt (CreateProcess).
    ['CreateProcessW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR']

    der string schaut so aus:

    string wtvRecorderEXE = m_wtvPath + "\\wtvRecorder.exe";
    

    und der aufruf so:

    HANDLE hProcess = CreateProcess( wtvRecorderEXE.c_str( ), NULL, NULL, NULL, TRUE, HIGH_PRIORITY_CLASS, NULL, m_wtvPath , &si, &pi );
    

    ohne .c_str( ) bekomme ich diese meldung:
    ['CreateProcessW' : cannot convert parameter 1 from 'std::string' to 'LPCWSTR']

    wenn mir jemand einen tipp geben könnte, wie ich string/char richtig in LPCWSTR umwandeln könnte?

    Habe gelesen, das habe etwas mit unicode und so zu tun, dann bitte nicht mehr mit sowas antworten, eine umstellung ist nämlich nicht möglich, da ich hier nur ein größeres projekt modifizieren (GHost++ http://forum.codelain.com) und hier evtl. dann gar nichts mehr geht.



  • Krauzi schrieb:

    Habe gelesen, das habe etwas mit unicode und so zu tun, dann bitte nicht mehr mit sowas antworten, eine umstellung ist nämlich nicht möglich.

    Okay, dann kannst du leider nicht mehr weiterarbeiten.

    Das W in LPCWSTR bedeutet Wide. Es geht also um const wchar_t* . Entsprechend brauchst du std::wstring und Widestring-Literale:

    L"text"
    

    Du kannst natürlich auch einfach casten, aber besonders sauber ist das nicht.



  • Und Standard-C++ ist es auch nicht...



  • CreateProcessA ??



  • Hier ein Lösungsansatz:

    Es geht mit casten, aber nur von std::wstring aus.
    Mit stringstreams kannst du std::string in std::wstring umformen. (Hab ich vor 30 Minuten gelesen, aber hab dann direkt wstring anstelle von string genommen)

    Und dann einfach

    reinterpret_cast<LPCWSTR>(string.c_str())
    


  • wie helferlein_unreg schon sagte, nimm CreateProcessA. das ist die ascii-version
    von CreateProcess (ist ja nur ein makro). das akzeptiert ein const char *



  • Nexus schrieb:

    Krauzi schrieb:

    Habe gelesen, das habe etwas mit unicode und so zu tun, dann bitte nicht mehr mit sowas antworten, eine umstellung ist nämlich nicht möglich.

    Okay, dann kannst du leider nicht mehr weiterarbeiten.

    Das W in LPCWSTR bedeutet Wide. Es geht also um const wchar_t* . Entsprechend brauchst du std::wstring und Widestring-Literale:

    L"text"
    

    Du kannst natürlich auch einfach casten, aber besonders sauber ist das nicht.

    wstring hab ich auch schon probiert, aber dann kommt:
    'CreateProcessW' : cannot convert parameter 1 from 'std::wstring' to 'LPCWSTR'



  • Wie ich bereits geschrieben habe

    reinterpret_cast<LPCWSTR>(wstring.c_str())
    

    so funktioniert es, hab es selber so im Code.



  • Neo Gandar schrieb:

    so funktioniert es, hab es selber so im Code.

    Pfusch! Allein schon auf die Idee zu kommen das ein Cast in den richtigen Zeichensatz konvertiert zeugt ja regelrecht vor Unwissenheit!



  • C++'ler schrieb:

    Neo Gandar schrieb:

    so funktioniert es, hab es selber so im Code.

    Pfusch! Allein schon auf die Idee zu kommen das ein Cast in den richtigen Zeichensatz konvertiert zeugt ja regelrecht vor Unwissenheit!

    Der Post zeigt, dass du meinen Beitrag nicht genau gelesen hast.

    Es wird hier kein Zeichensatz konvertiert, da die Daten ja bereits als wstring vorliegen! Es wird nur der Typ geändert.

    Es ist sicher nicht die eleganteste Lösung, aber sie funktioniert da wo ich sie benutzte, und das genügt mir.





  • soviel pfusch! Wenn ein Umlaut im WideString drin ist und du den in SBString "castest" hast du keinen Umlaut mehr. Kurz: Pfusch!



  • es muss doch wohl irgendwie eine saubere methode geben, wie man string in LPCWSTR umwandeln kann!

    EDIT: und umlaute sollten eigentlich auch mit convertiert werden.


  • Administrator

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-168607.html

    Und von std::wstring kommst du dann ganz einfach zu LPCWSTR , einfach über die Methode std::wstring::c_str . Da ist auch kein Cast nötig, da ein LPCWSTR nichts anderes ist als ein wchar_t const* und genau dies gibt auch std::wstring::c_str zurück

    Grüssli



  • Ansonsten (wurde zwar schon gesagt) CreateProcessA direkt aufrufen...



  • LordJaxom schrieb:

    Ansonsten (wurde zwar schon gesagt) CreateProcessA direkt aufrufen...

    das gibt aber irgendwie auch probleme.

    also hier mal den code:

    m_wtvPath = CFG->GetString( "wtv_path", "C:\\Program Files\\WaaaghTV Recorder\\" );
    
    string CConfig :: GetString( string key, string x )
    {
    	if( m_CFG.find( key ) == m_CFG.end( ) )
    		return x;
    	else
    		return m_CFG[key];
    }
    
    		STARTUPINFOA si;
    		PROCESS_INFORMATION pi;
    
    		//ZeroMemory( &si, sizeof(si) );
    		//si.cb = sizeof(si);
    		ZeroMemory( &pi, sizeof(pi) );
    
    		string wtvRecorderEXE = m_wtvPath + "\\wtvRecorder.exe";
    
    		//hProcess = CreateProcess( _T("D:\\Programme\\wc3tv\\wtvRecorder.exe"), NULL, NULL, NULL, TRUE, HIGH_PRIORITY_CLASS, NULL, _T("D:\\Programme\\wc3tv\\" ), &si, &pi );
    		HANDLE hProcess = CreateProcess( wtvRecorderEXE, NULL, NULL, NULL, TRUE, HIGH_PRIORITY_CLASS, NULL, m_wtvPath, &si, &pi );
    
    		if( !hProcess )
    			CONSOLE_Print( "[WaaaghTV] : Failed to start wtvRecorder.exe" );
    		else
    		{
    			m_CurrentGame->wtvprocessid = int( pi.dwProcessId );
    			CONSOLE_Print( "[WaaaghTV] : wtvRecorder.exe started!" );
    			CloseHandle( hProcess );
    		}
    

    aber mit CreateProcessA klappts soweit ganz gut, brauch ich jetzt noch CloseHandle? oder kann ich das weglassen?



  • Irgendwie?

    Also irgendwie arbeitet ihr wohl durchgehend mit ANSI-Strings, das Projekt übersetzt aber im UNICODE-Modus. Irgendwie finde ich, dass das bereits problematisch ist :). Eine Möglichkeit wäre auch, das komplette Projekt auf ANSI umzustellen, damit WinAPI selbst die ANSI-Version von CreateProcess auswählt.



  • ich verstehe das problem nicht. du musst einfach nur "CreateProcess"
    durch "CreateProcessA" ersetzen. ein buchstabe mehr und gut is. klappt im
    unicode modus und gibt keine probleme. warum wills tdu as den nicht nutzen?



  • CreateProcessA schrieb:

    ich verstehe das problem nicht. du musst einfach nur "CreateProcess"
    durch "CreateProcessA" ersetzen. ein buchstabe mehr und gut is. klappt im
    unicode modus und gibt keine probleme. warum wills tdu as den nicht nutzen?

    neeeeeeein?
    bei createprocessa braucht man auch auch andere startup infos.
    aber so klappt es:

    STARTUPINFO si;
    		PROCESS_INFORMATION pi;
    
    		ZeroMemory( &si, sizeof(si) );
    		si.cb = sizeof(si);
    		ZeroMemory( &pi, sizeof(pi) );
    
    		string wtvRecorderEXE = m_wtvPath + "\\wtvRecorder.exe";
    
    		//hProcess = CreateProcess( _T("D:\\Programme\\wc3tv\\wtvRecorder.exe"), NULL, NULL, NULL, TRUE, HIGH_PRIORITY_CLASS, NULL, _T("D:\\Programme\\wc3tv\\" ), &si, &pi );
    		//HANDLE hProcess = CreateProcess( wtvRecorderEXE, NULL, NULL, NULL, TRUE, HIGH_PRIORITY_CLASS, NULL, m_wtvPath, &si, &pi );
    		int hProcess = CreateProcessA( wtvRecorderEXE.c_str( ), NULL, NULL, NULL, TRUE, HIGH_PRIORITY_CLASS, NULL, m_wtvPath.c_str( ), LPSTARTUPINFOA(&si), &pi );
    
    		if( !hProcess )
    			CONSOLE_Print( "[WaaaghTV] : Failed to start wtvRecorder.exe" );
    		else
    		{
    			m_CurrentGame->wtvprocessid = int( pi.dwProcessId );
    			CONSOLE_Print( "[WaaaghTV] : wtvRecorder.exe started!" );
    			CloseHandle(pi.hProcess);
    			CloseHandle(pi.hThread);
    		}
    


  • theta schrieb:

    Casten ist KEINE Lösung!
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-244689-and-highlight-is-.html

    Im ref. Link steht wie Du es machen kannst.
    Simon


Anmelden zum Antworten