String^ zu LPCSTR geht einfach nicht...



  • Hallo,
    ich hab ein Problem, ich versuche schon seit einer Stunde in VC++

    ShellExecute(0,(LPCSTR)"open", program, NULL, NULL, SW_SHOWNORMAL);
    

    Diesen Code auszuführen.
    Es funktioniert jedoch nicht.
    Es geht auch nicht mit:

    ShellExecute(0,L"open", program, NULL, NULL, SW_SHOWNORMAL);
    

    Bei dem unterem Code kommt folgende Fehlermeldung.

    1>c:\c++\restarter\restarter\Form1.h(246) : error C2664: 'ShellExecuteA': Konvertierung des Parameters 2 von 'const wchar_t [5]' in 'LPCSTR' nicht möglich

    Dem dadrüber:

    error C2664: 'ShellExecuteA': Konvertierung des Parameters 3 von 'System::String ^' in 'LPCSTR' nicht möglich

    Hab schon alles mögliche mit:
    (char*)(void*)Marshal::StringToHGlobalAnsi("open");
    und noch anderen Konvertierungsfunktionen versucht...

    P.S: In der Projekteinstellung hab ich bei Zeichensatz: Nicht festgelegt.

    Danke schonmal.
    MfG leinad6



  • 1. Das L wird nicht benötigt, wenn Du bei Zeichensatz "Nicht festgelegt" hast.
    2. Den cast kannst Du Dir sparen. Casts bringen häufig den Compiler zum Schweigen, lösen aber das Problem nicht.
    3. Konvertiere den System::String^ (program) korrekt in ein LPCTSTR..

    FAQ:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-158664.html
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-158666.html

    Simon



  • Es geht immer noch nicht 😞

    Ich hab jetzt einfach mal versucht ein neues projekt zu erstellen und hab dort einfach eine Forms gemacht. Dann ein Button dadrauf.

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    
     ShellExecute(0,L"open",
    				L"C:\\Windows\\System32\\notepad.exe",
    				NULL, 
    			   	NULL, 
    				SW_SHOWNORMAL);
    			 }
    

    und in stdafx.h :

    // stdafx.h : Includedatei für Standardsystem-Includedateien
    // oder häufig verwendete projektspezifische Includedateien,
    // die nur in unregelmäßigen Abständen geändert werden.
    #pragma once

    // TODO: Hier auf zusätzliche Header, die das Programm erfordert, verweisen.
    #include <windows.h>

    Und jetzt hat der Linker probleme ....

    1>TESTING.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""extern "C" struct HINSTANCE__ * __stdcall ShellExecuteW(struct HWND__ *,wchar_t const *,wchar_t const *,wchar_t const *,wchar_t const *,int)" (?ShellExecuteW@@$$J224YGPAUHINSTANCE__@@PAUHWND__@@PB_W111H@Z)".
    1>C:\C++\Project1\TESTING\Release\TESTING.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    Mit struct StringConvA bei dem anderen Projekt kommt immer noch derselbe error bei raus...

    MfG leinad6



  • @theta: zu 1.; das stimmt nicht!
    Grundregel ist: *immer* _T (oder TEXT) verwenden man weder xxxA noch xxxW verwendet! Alles andere ist falsch!
    zu 3.: Ich sehe hier nirgends String^. Wo siehst Du die?

    1. Verwende immer _T!
    =>

    ShellExecute(0, _T("open"), 
                    _T("C:\\Windows\\System32\\notepad.exe"), 
                    NULL, 
                       NULL, 
                    SW_SHOWNORMAL);
    

    Und ansonsten:
    http://msdn.microsoft.com/en-us/library/bb762153

    Um das Lnker Problem zu lsen:

    #pragma comment(lib, "shell32.lib")
    


  • Ich bin ja so dumm, hab die ganze Zeit auf den 2. Parameter geguckt -.-
    Kein wunder das sich da nix verändert...
    Trotzdem vielen Dank 🙂



  • @Jochen:
    Zu 1. Ja.. ok. Natürlich ist _T(..) korrekt.
    Zu 3. Habe angenommen, dass program ein System::String ist.

    Simon



  • theta schrieb:

    Zu 3. Habe angenommen, dass program ein System::String ist.

    Ahh.. jetzt sehe ich es... sorry...



  • leinad6 schrieb:

    Hallo,
    ich hab ein Problem, ich versuche schon seit einer Stunde in VC++

    ShellExecute(0,(LPCSTR)"open", program, NULL, NULL, SW_SHOWNORMAL);
    

    Diesen Code auszuführen.
    Es funktioniert jedoch nicht.
    Es geht auch nicht mit:

    ShellExecute(0,L"open", program, NULL, NULL, SW_SHOWNORMAL);
    

    gibt es eigentlich einen Grund wieso Du nicht System::Diagnostics::Process verwendest?


Anmelden zum Antworten