Problem mit 'LPCWSTR'



  • 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