char[] nach LPCWSTR *verzweifel*



  • Quellcode schrieb:

    hallihallo Gemeinde,

    ich verzweifle fast noch an ienem Problem.
    Und zwar versuche ich mit ShellExecute ein Programm starten zu lassen.
    Der Pfad muss aber vom Typ LPCWSTR sein, liegt aber in char[] vor.

    Die große Preisfrage ist nun:
    Wie konvertier ich das?

    Ich hab mich schon totgegoogelt, aber weiter als bis zur erklärung von MultiByteToWideChar bei msdn.microsoft(die ihc nicht kapiere) komme ich nicht.

    Könnt ihr mir helfen?

    PS:
    char name[] = "Hans";
    LPCWSTR name2;
    Wie krieg ich das da rein?... 😡

    LPCWSTR name2 = L"Hans";
    

    ? 🙂



  • Hallo,

    du solltest dich entscheiden ob du Multibyte oder Unicode schreiben willst. Das ist das blöde an den ganzen Tutorials im Internet, die sind alle Multibyte aber die MSVC bei neuen Projekten Unicode vorgibt.

    Das bedeutet das du bei Unicode anstatt char TCHAR verwenden solltest. Von dieser ShellExecute und all den anderen Winapi Funktion gibt es nämlich W und A Funktion wobei W für Unicode ist. In der Programmierung soweit ohne Bedeutung da die Einstellung des Zeichensatzes das übernimmt. Also anstatt ShellExecuteW() einfach ShellExecute() aber dann mit TCHAR wenn Unicode, wenn jedoch Multibyte dann mit char

    Also unter Unicode

    TCHAR name[] = TEXT("bla");
    ShellExecute(name);

    Ob Unicode oder Multibyte kannst du in den Projekteinstellungen ändern, irgendwas mit Zeichensatz.



  • Elektronix schrieb:

    in C++: reinterpreteCast.
    Ic C:

    name2 = ((LPCWSTR) name)
    

    oder so ähnlich.

    @Elektronix: Und was erwartest Du denn nach der Anweisung?

    Ich schätze mal, dieser Code ergibt nicht das gewünschte Verhalten.



  • Hab das mal ausprobiert mit TCHAR...
    sieht dann wie folgt aus:

    TCHAR name[] = TEXT(op2);
    

    ist dann folgendes:

    'Lop2': nichtdeklarierter Bezeichner

    Was zur Höll ist Lop2, ihc hab das nie deklariert oder dergleichen..
    kommentiere ich die Zeile aus, komm tder fehler nicht...

    achja op2 ist:

    char op2[256]
    

    Und wie nun weiter?



  • Zu:
    LPCWSTR str = ((LPCWSTR)name);

    Der Compiler meckert nicht mehr, aber es funktioniert nicht, wenn ich str
    in ShellExecute verwende (er macht gar nichts).



  • Quellcode schrieb:

    Zu:
    LPCWSTR str = ((LPCWSTR)name);

    Der Compiler meckert nicht mehr, aber es funktioniert nicht, wenn ich str
    in ShellExecute verwende (er macht gar nichts).

    Siehe mein letzter Post.



  • und was mach ich nun?

    Ich will das unbedingt umwandeln...



  • In der FAQ gibts ein Thread (der Code befindet sich ziemlich unten:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-161855.html



  • Die Funktion ShellExecute erwartet unter Multibyte ein LPCTSTR unter Unicode aber einen LPCWSTR. Wenn du einen pfad zu einer Datei hast dann schreibst du den ja in einer variable, also einen char arry.

    Wenn deine IDE bei ShellExecute einen LPCWSTR haben will, dann steht dein projekt auf Unicode weil ShellExecute an ShellExecuteW weiterleitet .. so ausgedrückt.

    Entweder packst du die Daten in TCHARs anstatt chars oder du stellt dein projekt auf Multibyte. Mit Multibyte leitet deine IDE an ShellExecuteA weiter die deinen char (LPCTSTR ) schluckt.

    Unicode:
    TCHAR sDateipfad[] = TEXT("c:\\meineanwendung.exe");
    ShellExecute( ..., sDateipfad, ...); // Leitet an ShellExecuteW weiter

    Multibyte:
    char sDateipfad[] = "c:\\meineanwendung.exe"; // oder _T("") oder doch mit TEXT("") .. ka



  • Ich hab mein Problem gelöst....
    Anstelle von ShellExecute hab ich einfach ShellExecuteA genommen und mein
    char *pathname ="blablabla" auf LPCSTR path gelegt.

    SO geht jetzt alles...
    Mensch, der schöne Tag is schon halb rum... 😞 scheiss ehrgeiz

    EDIT: grad mitbekommen, dass es auch ohne LPCSTR path geht...

    Danke allen, dir ihre zeit geopfert haben, mir bei meinem Problem zu helfen.



  • scheiss ehrgeiz

    Naja, soviel ehrgeiz ist da nicht drin, denn es gibt schon schwierigkeiten bei der Unicode Variante.



  • Quellcode schrieb:

    Hab das mal ausprobiert mit TCHAR...
    sieht dann wie folgt aus:

    TCHAR name[] = TEXT(op2);
    

    ist dann folgendes:

    'Lop2': nichtdeklarierter Bezeichner

    Was zur Höll ist Lop2, ihc hab das nie deklariert oder dergleichen..
    kommentiere ich die Zeile aus, komm tder fehler nicht...

    achja op2 ist:

    char op2[256]
    

    Und wie nun weiter?

    TEXT is einfach nur ein Makro:

    #define __TEXT(quote) L##quote
    

    D.h. es setzt einfach ein L vor die "".. Und wenn du nun op2 übergibst ensteht natürlich Lop2. Das Makro is auch nur für String-Literale gedacht, nich für Variablen



  • achso...

    naja muss man halt erstmal wissen


Anmelden zum Antworten