Probleme mit der Funktion ShellExecute



  • Hallo,

    Ich habe ein "kleines" Problem mit der Funktion ShellExecute. Nachdem ich jetzt mehrere Wochen vergeblich im Inet gesucht habe versuche ich nun hier mal eine Antwort zu bekommen / finden.

    Problem : ShellExecute wird nicht ausgeführt / nicht komplett / nicht normal ... ausgeführt.

    source Zeile im meinem Sourcecode :

    ShellExecute(NULL, L"open", L"cmd", L"/c dir d:\\jdown\\ > d:\\dir.txt", NULL, SW_NORMAL);
    

    wird so einzelnt aufgerufen nicht ausgeführt. (Zeile habe ich im Inet gefunden sollte so funktionieren.
    Setzte ich jedoch noch eine weitere Zeile dahinter :

    ShellExecute(NULL,NULL,L"http://www.google.de",NULL,NULL,SW_SHOWNORMAL);
    

    werden die 2 Befehle korrekt ausgeführt. D.h. die datei dir.txt wird korrekt erstellt und die Internet Seite wird korrekt in meinem Browser geöffnet. Nur ist der 2te aufruf der Funktion von mir nicht gewollt / sinnvoll.

    Hat jemand eine Idee was hier falsch läuft ?

    Ich nutze Embarcadero® C++Builder 10.4 Version 27.0.40680.4203 Com. Edition.

    Kompletter Source meiner Funktion (wie man sehen kann habe ich einiges Getestet was nicht funktioniert. Dies habe ich dann aus kommentiert ) :

    void __fastcall TDBBearbeitenForm1::DirErstellenButton1Click(TObject *Sender)
    {
    	UnicodeString Befehl, FirstParam, SecondParam;
    	UnicodeString DirDateiZeile;
    
    	if( FileExists( "d:\\dir.txt" ) )
    	{
    		DeleteFile( "d:\\dir.txt" );
    	}
    
    	Befehl = "dir " + DBDirectoryListBox1->Directory + "\\ /b /s /on /a-d >d:\\dir.txt";
    //	Befehl = "/c dir " + DBDirectoryListBox1->Directory + "\\ /b /s /on /a-d >d:\\dir.txt";
    	FirstParam = "open";
    	SecondParam = "cmd";
    
    	Edit1->Text = Befehl;
    
    //	ShellExecute( NULL, L"open", TheFile.c_str(), NULL, NULL, SW_SHOWNORMAL);
    	ShellExecute(NULL, L"open", L"cmd", L"/c dir d:\\jdown\\ > d:\\dir.txt", NULL, SW_NORMAL);
    
    //	system("dir f:\\sexy /p");
    //	system( Befehl.c_str() );
    //	system( Befehl.t_str() );
    //	system( Befehl.w_str() );
    
    //	ShellExecute(NULL, FirstParam, SecondParam, Befehl, NULL, SW_NORMAL);
    //	ShellExecute(NULL, L"open", L"cmd", Befehl.c_str(), NULL, SW_NORMAL);
    //	ShellExecute(NULL, FirstParam.c_str(), SecondParam.c_str(), Befehl.c_str(), NULL, SW_NORMAL);
    
    	ShellExecute(NULL,NULL,L"http://www.google.de",NULL,NULL,SW_SHOWNORMAL);
    
    	DirDateiListe->LoadFromFile( "d:\\dir.txt" );
    	DirDateiListe->Sort();
    
    	for( int Zeile = 0; Zeile < DirDateiListe->Count; Zeile++ )
    	{
    		DirDateiZeile = DirDateiListe->Strings[ Zeile ];
    		DirStringGrid1->Cells[0][DirStringGrid1->RowCount -1] = DirStringGrid1->RowCount -1;
    		DirStringGrid1->Cells[1][DirStringGrid1->RowCount -1] = DirDateiZeile;
    		DirStringGrid1->RowCount++;
    	}
    }
    
    

    Nachtrag :
    Wenn ich :

    	Befehl = "dir " + DBDirectoryListBox1->Directory + "\\ /b /s /on /a-d >d:\\dir.txt";
    	ShellExecute(NULL, L"open", L"cmd", Befehl.c_str(), NULL, SW_NORMAL);
    

    nutze dann öffnet sich die EIngabeaufforderung und wechselt in meine gewünschte Directory jedoch wird der dir befehl nicht ausgeführt. nur wenn ich direkt :

    	ShellExecute(NULL, L"open", L"cmd", L"/c dir d:\\jdown\\ > d:\\dir.txt", NULL, SW_NORMAL);
    

    nutze läuft es wie gewünscht.
    Ich kann den Fehler nicht finden.... 😞



  • Hast du schon den Rückgabewert von ShellExecute ausgewertet?

    PS: Warum erstellst du überhaupt diese externe Datei? Nur um sie dann wieder einzulesen?
    Benutze doch einfach TDirectory.GetFiles(...).



  • @Gleus sagte in Probleme mit der Funktion ShellExecute:

    Ich habe es mal kurz nachgestellt, es funktioniert ohne Probleme (C++Builder 10.3).
    Allerdings verwende ich die AnsiString-Version.
    Bei Unicode muss ich immer explizit ShellExecuteW() aufrufen (habe ich aber hier nicht getestet).

    Befehl = L"/c dir " + DBDirectoryListBox1->Directory + L"\\ /b /s /on /a-d >d:\\dir.txt";
    
    Falls Project=>Optionen=>Gemeinsame Optionen => _TCHAR entspricht char
    - ShellExecute(NULL, "open", "cmd", AnsiString(Befehl).c_str(), NULL, SW_NORMAL);
    sonst
    - ShellExecuteA(NULL, "open", "cmd", AnsiString(Befehl).c_str(), NULL, SW_NORMAL);
    
    

Anmelden zum Antworten