String zu LPCSTR konvertieren, aber wie?
-
dies funktioniert bei mir problemlos
std::vector<std::string> lStrVec; lStrVec.push_back("XXX"); lStrVec.push_back("YYY"); for (int i=0; i<lStrVec.size(); i++) { LPCSTR lStr = lStrVec[i].c_str(); printf("%s\n",lStr ); }
mfg Kyro
-
dabei stürtzt mein Kompeiler ab...
-
Wie stürzt er denn ab? Mit welcher Fehlermeldung? Und welcher Compiler ist das überhaupt?
-
Verwende VS 2008
Und die Fehlermeldung die er aus gibt Lautet:“Expression: vector subscript out of range
For information on how your programm can cause an essertion failure, see the Visual C++ documentation on asserts”
Fehler tritt in der datei c:\programme\microsoft visual studio 9.0\vc\include\vector
In der Zeile 779 auf.
-
Oh mann… Ich Depp!
Habe das Problem gefunden und behoben.
Bin mal wieder über das Nullsetellen Problem gestolpert...
Sorry alle mit einander.
Aber Danke Für die Hilfe!
-
Auja, das Nullstellenproblem ist echt uebel...
-
Hallo,
sorry wenn ich einen alten Post rauskrame, aber ich wollte kein neues Thread aufmachen.
Ich benutze in meinem Project (VisualStudio2008) MultiByte und
will ein Fenster erstellen.
Ich habe einenstd::string windowName="HalloWin32"
definiert.
Wenn ich diesen string beim erstellen des Fensters benutze schlägt die Registrierung der Fensterklasse fehl.
Ich übergebe den String so:wcex.lpszClassName = (LPCTSTR)windowName.c_str(); ... if (!RegisterClassEx (&wcex)){ MessageBox (0,(LPCSTR)windowName.c_str(), TEXT ("ERROR"), MB_ICONERROR);} hWnd = CreateWindowEx ( 0, (LPCSTR)windowName.c_str(), (LPCTSTR)windowName.c_str() ...) ...
Wie bereits erwähnt liefert RegisterClassEx 0 zurück und die MessageBox popt auf.
Wenn ich anstelle von
(LPCSTR)windowName.c_str()
TEXT("XXX")
benutze läuft alles bestens.
Warum also kann ich bei der MessageBox den std::string benutzen und bei CreateClassEx und lpszClassName nicht - obwohl alle drei LPCSTR erwaren.
Hoffe ihr könnt mir helfen.
Gruß
-
Weil ein std::string_c_str eben keinen LPCTSTR liefert sondern evtl. einen LPCSTR!
Du jast den Unterschied zwischen Unicode (LPWSTR, wchar_t) und MBCS (LPSTR, char) und (LPTSTR, TCHAR) nicht verstanden.
TCHAR nimmt den Typ an, den Du im Projekt vorgibst, also entweder char oder wchar_t.
Folgerichtig muss ein cast wie dieserwcex.lpszClassName = (LPCTSTR)windowName.c_str();
in einem Unicode Projekt fehlschlagen.
-
ich habe ja kein unicode Project,(siehe mein Post)
wcex.lpszClassName
erwartet in meinem Project LPCSTR - da es NICHT unicode
verwendet . undstd::string.c_str()
liefert ja einen
char * zurück.
LPCSTR steht fürconst char *
die einzigste Frage ist also wie ich von
char * auf const char *
caste. Es soll ja mit const_cast möglich sein, allerdings steht in den meisten Foren, das man lieber die Finger davon lassen soll.
Mich wundert vor allem das die MessageBox den cast annimmt und der Rest nicht.
-
Dieser Code hier funktionert bei mir einwandfrei:
static TCHAR szAppName[] = TEXT ("HelloWin") ; HWND hwnd ; MSG msg ; WNDCLASSEX wndclass ; wndclass.cbSize = sizeof (WNDCLASSEX); std::string windowName="HalloWin32"; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = &WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = windowName.c_str() ; wndclass.hIconSm = wndclass.hIcon; if (!RegisterClassEx (&wndclass)) { // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), szAppName, MB_ICONERROR) ; return 0 ; }
Du kannst ja mal mehr Code posten und GetLastError aufrufen, um zu sehen, wo der Fehler liegt.
-
ja der code funktioniert, das war mir klar. Ich würde aber am liebsten mit
den std::strings arbreiten- also den namen im std::string speichern und beim übergeben einfach casten.
mein code sieht genau so aus wie deiner, ausser das der name in einen std::string gespeichert ist in ich den dann wie oben angegeben übergebe.
Wie gesagt ist mein projenct nicht UNICODE.
Der Fehler ist das meine MessageBox funktion anspringt.
Ich habe es im moment so gelöst:... ... mc_windowSettings.m_windowName = "HelloWin32"; ... ... int iiWINDOW::mCreateMainWindow() { char *pBuffer; pBuffer = new char [mGetWindowSettings().m_windowName.size() +1]; strcpy (pBuffer, mGetWindowSettings().m_windowName.c_str()); wcex.cbSize = sizeof WNDCLASSEX; wcex.lpszClassName = pBuffer;//(LPCSTR)mGetWindowSettings().m_windowName.c_str(); wcex.style = CS_HREDRAW|CS_VREDRAW; wcex.lpfnWndProc = iiWINDOW::WndProc; wcex.hInstance = GetModuleHandle(NULL); wcex.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH); wcex.hCursor = LoadCursor (0,IDC_ARROW); wcex.hIcon = LoadIcon (0,IDI_APPLICATION); wcex.lpszMenuName = 0; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hIconSm = 0; if (!RegisterClassEx (&wcex)){ MessageBox (0,(LPCSTR)mGetWindowSettings().m_windowName.c_str(), TEXT ("ERROR"), MB_ICONERROR);} hWnd = CreateWindowEx ( 0, pBuffer,//(LPCSTR)mGetWindowSettings().m_windowName.c_str(), pBuffer,//(LPCSTR)mGetWindowSettings().m_windowName.c_str(), WS_OVERLAPPEDWINDOW|WS_VISIBLE, mGetWindowSettings().mc_windowRect.m_leftBorder, mGetWindowSettings().mc_windowRect.m_upperBorder, mGetWindowSettings().mc_windowRect.m_rightBorder, mGetWindowSettings().mc_windowRect.m_lowerBorder, GetDesktopWindow(), 0, GetModuleHandle(0), 0);
Die ersten 3 Zeilen in der Funktion will ich in eine Funktion packen.
Ich überlege mir vieleicht sowieso eine art WinString Klasse zu schreiben die konvertierung hin und zurück anbietet und änlich nützliches Zeug.
Achtet bitte nochmal darauf das in der MessageBox die Konvertierung einwandfrei funktioniert und selbst wenn ich (LPCSTR) weglasse wird der Name des Fensters in der MSGBox angezeigt.
-
Mein Code arbeitet auch mit std::string. Du solltest GetLastError aufrufen
-
Zudem lass doch die cats's weg. Die sind unnötig und führen nur zu Fehlern... Auch das umkopieren des Klassennamens ist unnötig.
-
Martin Richter schrieb:
Zudem lass doch die cats's weg. Die sind unnötig und führen nur zu Fehlern... Auch das umkopieren des Klassennamens ist unnötig.
das habe ich schon ausprobiert... wie gesagt in der MessageBox geht es auch ohne casts. bei className und CreateWindow geht beides nicht (mit und ohne casts)
Melan schrieb:
Mein Code arbeitet auch mit std::string. Du solltest GetLastError aufrufen
sorry habe ich übersehen... wozu dan das Array ganz vorne?
an welcher Stelle soll ich denn GetLastError aufrufen?
-
So in etwa:
char buffer[100]; sprintf(buffer, "%d", GetLastError()); MessageBox(0, buffer, buffer, 0);
Gleich nach RegisterClassEx aufrufen und dann in der MSDN Dokumentation den Fehler Code ansehen.
-
Ich habe die Funktion direkt nach der Registrierung aufgerufen der Wert ist 0
Wenn ich die Funktion nach CreateWindowEx aufrufe gibt es die meldung 1407
Bedeutet:
Cannot find window class.
Wenn ich den Aufruf in die MessageLoop verschiebe wird die Funktion Garnicht aufgerufen... also wird die erste Nachricht garnicht geschickt.
Irgendwas in der CreateWindowEx Funktion ist Falsch.
-
Unsinn 1407 bedeutet: "Fensterklasse wurde nicht gefunden."
Wo hast Du denn nun GetLastError eingebaut?
-
Habe mein Beitrag paarmal editiert siehe oben.
Bin irgendwie in die Datenbank Fehlermeldungen reingerutscht
-
Habe jetzt einen 2 string direkt vor der vor der initialisirung der WINCLASSEX
Klasse erstelltstd::string windowName2 = "HelloWin64";
und diesen dann benutzt, und siehe da es geht.
Anscheinend habe ich mich irgendwie vertüdelt in der Klasse.
-
Alles klar habe den Fehler behoben ohne das ich genau verstehe wo der liegt.
Danke für den Tipp mit GetLastError().