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 dustd::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 dustd::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.
-
Casten ist KEINE Lösung!
http://www.c-plusplus.net/forum/viewtopic-var-t-is-244689-and-highlight-is-.html
-
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.
-
http://www.c-plusplus.net/forum/viewtopic-var-t-is-168607.html
Und von
std::wstring
kommst du dann ganz einfach zuLPCWSTR
, einfach über die Methodestd::wstring::c_str
. Da ist auch kein Cast nötig, da einLPCWSTR
nichts anderes ist als einwchar_t const*
und genau dies gibt auchstd::wstring::c_str
zurückGrü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-.htmlIm ref. Link steht wie Du es machen kannst.
Simon