ShellExecute und cast



  • Hallo zusammen

    Ich möcht mit ShellExecute eine weitere Anwndung öffnen. Doch bei der Parameterübergabe funktioniert der cast nicht. Also ich mache folgendes:

    ::ShellExecute(0, L"open", L"person.exe", str_projekt.c_str(), 0, SW_SHOWNORMAL);
    

    Wenn ich das das Konstruckt ausführe kommt folgender Fehler.

    [bcc64 Fehler] ein Parameter des Typs 'LPCWSTR' (aka 'const wchar_t *') kann nicht mit einem R-Wert des Typs 'char *' initialisiert werden
      shellapi.h(74): hier Argumentübergabe an Parameter 'lpParameters'
    

    Wenn ich an Stelle von "str_projekt.c_str()" ein einfacher String mit L"parameter" übergebe so wird das Programm ausgeführt und der Parameter kann in der aufgerufenen Anwendung gelesen werden.

    Wenn ich als cast folgendes eingeben "(LPCWSTR)str_projekt.c_str()" dann wird das Programm ausgeführt, aber in der aufgerufenen Anwendung kann er nicht gelesen werden.

    Was muss ich machen, dass alles funktioniert?

    Gruss Renato



  • Statt

    str_projekt.c_str()
    
    str_projekt.w_str()
    

    benutzen. 😉



  • AnsiString::w_str() gibt es zum Glück nicht.

    Um einen gewöhnlichen (UTF-16-)String aus einem AnsiString zu bekommen, mache String(str_projekt) . Den zugehörigen C-String bekommst du dann mit String(str_projekt).c_str() , und den kannst du auch an ShellExecute() übergeben. An der Stelle solltest du dich dann aber auch fragen, warum str_projekt überhaupt vom Typ AnsiString und nicht String ist.



  • Ich verwende meist AnsiString da ich der Meinung bin, dass String und AnsiString synonyme sind.



  • und wenn du es so machst?

    ShellExecuteA(0, "open", "person.exe", str_projekt.c_str(), 0, SW_SHOWNORMAL);
    


  • Robbiani schrieb:

    da ich der Meinung bin, dass String und AnsiString synonyme sind.

    Da irrst du. String und UnicodeString sind synonym. AnsiString kann nicht alle Unicode-Zeichen darstellen und deshalb zu Datenverlust führen.



  • Herzlichen Dank für eure Hilfe.

    Genau mit ShellExecuteA läuft es.
    Was mich wundert sind die verschiedenen Möglichkeiten wo es gibt.



  • audacia|off schrieb:

    Da irrst du. String und UnicodeString sind synonym. AnsiString kann nicht alle Unicode-Zeichen darstellen und deshalb zu Datenverlust führen.

    Das hängt aber von der verwendeten Version des Builders ab.



  • Braunstein schrieb:

    audacia|off schrieb:

    Da irrst du. String und UnicodeString sind synonym. AnsiString kann nicht alle Unicode-Zeichen darstellen und deshalb zu Datenverlust führen.

    Das hängt aber von der verwendeten Version des Builders ab.

    Ich habe jetzt mal unterstellt, daß Robbiani nach wie vor C++Builder XE7 benutzt.



  • Damit hast du sicher recht. Manchmal schaue ich zu sehr durch meine BCB2007 Brille. 🙂



  • ShellExecute(0, L"open", L"person.exe", str_projekt.c_str(), 0, SW_SHOWNORMAL);

    Würde wohl wahrscheinlich mit der Widestring Funktion "ShellExecuteW" funktionieren.



  • Wenn str_projekt.c_str()ein const char* zurückgibt eben nicht.


Log in to reply