String zu LPCSTR konvertieren, aber wie?



  • Hallo Mit einander,
    hoffe das ich hier im Richtigen Forum poste…
    Ich Brauche nämlich Hilfe dabei einen String in einen LPCSTR zu konvertieren.
    Es geht um folgendes Code Segment, was auch Zeigt was ich schon alles versucht habe.

    //ein übergabe parameter
    vector <string> DllFileNames
    
    LPCSTR somestring;
    somestring = (LPCSTR)DllFileNames[DllPlace];
    TestDll = LoadLibraryA(somestring);//HWDllSimTest.dll
    

    Würde mich über jede Hilfe sehr Freuen.

    Grüße
    Mojo Zache



  • Hast du schon mal das probiert:

    string x = "abc";
    LPCSTR y = x.c_str();
    

    sollte funktionieren

    mfg
    Kyro



  • Ich fürchte nein.
    Leider ist das Problem auch mit dem Vector verknüpft. Der einen Fehler bei der Folgenden Umsetzung ausgibt.

    TestDll = LoadLibraryA(DllFileNames[DllPlace].c_str())
    

    Der Fehler ist leider auch ein komplettes abschmieren des Debuggers…



  • 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 einen

    std::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ß


  • Mod

    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 dieser

    wcex.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 . und

    std::string.c_str()
    

    liefert ja einen
    char * zurück.
    LPCSTR steht für

    const 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


  • Mod

    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.


  • Mod

    Unsinn 1407 bedeutet: "Fensterklasse wurde nicht gefunden."

    Wo hast Du denn nun GetLastError eingebaut?


Anmelden zum Antworten