Zeichenkettenkonstante in »LPSTR {aka char*}



  • Hallo zusammen,

    Bin ziemlich neu bei C++ habe bis jetzt Java und C# entwickelt. Habe nun ein Problem bei aufrufen einer Methode.

    und zwar versuche ich folgendes:

    try {
            STARTUPINFOA * stinfo = new STARTUPINFOA;
            PROCESS_INFORMATION info ;
          CreateProcess(NULL,TEXT("notepad.exe"),NULL,NULL,true,0x00000008,
        		  NULL,NULL,stinfo,&info);
    
                 WaitForSingleObject( info.hProcess, INFINITE );
    

    leider meldet der Compiler folgendes Problem:

    ..\main.cpp:55:94: Warnung: veraltete Konvertierung von Zeichenkettenkonstante in »LPSTR {aka char*}« [-Wwrite-strings]
    

    Wäre froh wenn mir kurz jemand erläutern könnte was ich bei diesem Aufruf falsch mache.

    Danke und Gruss
    Lizyulis



  • Das 2. Argument von CreateProcess(..) muss beschreibar sein, also kein String Literal.
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx

    Edit:
    Für das 2. Argument kannst Du sowas machen:

    TCHAR commandLine[] = _T("notepad.exe");
    

    Edit:
    Ausserdem sind da wohl noch ein paar Java Angewohnheiten zu erkennen:
    1. Wofür ist das try ? CreateProcess(..) und die anderern Win32 API Funktionen werfen keine C++ Exceptions.
    2. new wird in C++ nicht oft verwendet oder nur versteckt. Konkret bedeutet das in deinem Fall, dass STARTUPINFO auch als automatische Variable angelegt werden kann und soll (ausserdem sollte STARTUPINFO und nicht die Version mit A oder W verwendet werden, das erledigen die Win32 API Makros):

    STARTUPINFO startupInfo = {}; // Gleich Initialisieren.
    //...
    CreateProcess(... &startupInfo ...)
    

    3. CloseHandle(..) bei hThread und hProcess von PROCESS_INFORMATION nicht vergessen. Du hast den Code nicht gezeigt - aber es geht oft vergessen.
    4. Return Werte prüfen - von CreateProcess(..), WaitForSingleObject(..), etc.

    Edit: Am besten liest Du dir die verlinkte Doku ganz genau durch. Z.B. muss der Member cb von STARTUPINFO mit sizeof(STARTUPINFO) initialisiert werden, etc.etc.



  • Hi Theta

    Danke dir für Deine schnelle Antwort. Ist woll so das ich die Java bzw. C# angewonnheiten noch nicht abgelegt habe!:-)

    Danke für den Link und für die Erklärung.

    STARTUPINFOA stinfo = {};
            PROCESS_INFORMATION  info = {};
            TCHAR t[] = _T("notepad.exe");
          CreateProcess(NULL,&t,NULL,NULL,true,0x00000008,
        		  NULL,NULL,stinfo,&info);
    
                 WaitForSingleObject( info.hProcess, INFINITE );
    
    ..\main.cpp:58:31: Fehler: »TCHAR (*)[12] {aka char (*)[12]}« kann nicht nach »LPSTR {aka char*}« für Argument »2« nach »BOOL CreateProcessA(LPCSTR, LPSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, PVOID, LPCSTR, LPSTARTUPINFOA, LPPROCESS_INFORMATION)« umgewandelt werden
    

    Leider immer noch ein Fehler. Muss glaube ich nochmals über dir Bücher.

    Gruss
    Lizyulis



  • &t soll t sein.



  • Super danke jetzt klappt es. Hmm... sollte mir glaub ein Buch holen und mich ein bisschen vertiefen in die Materie. 🙂

    Gruss
    Lizyulis


Anmelden zum Antworten