2016-11-01 2 views
0

Ich möchte den Inhalt eines Verzeichnisses mit DOS-Befehlen aus Delphi (7) anzeigen. Verwenden von Win10 - 64Verzeichnis aus Delphi anzeigen

Das folgende Programm zeigt die DOS-Shell an, zeigt jedoch nicht die Verzeichnisinhalte an. Was ist falsch an meinem Code?

unit Unit1; 
interface 
uses 
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
Dialogs, StdCtrls, shellapi; 
type 
    TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 
var 
    Form1: TForm1; 

    implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
var i : integer; 
begin 
    i := ShellExecute(Handle, nil, 'cmd.exe', PChar(' dir'), nil, SW_SHOW); 
    caption := inttostr(i); 
end; 

end. 
+0

Wenn Ihre Frage zu Delphi ist, warum gibt es kein Delphi-Tag? Und DOS ist vor mehr als einem Jahrzehnt gestorben, daher können Sie keinen DOS-Befehl ausführen (außer Sie führen immer noch Windows XP oder früher). –

+2

DOS als OS ist lange tot, aber "cmd.exe" als Befehlsprozessor existiert noch in modernen Windows-Versionen. Aber die eigentliche Frage ist, warum 'cmd.exe' verwendet wird, um eine Verzeichnisliste zu erhalten, anstatt eine' FindFirst/Next() '- Schleife oder eine GUI-Komponente wie' TDirectoryListBox' (oder moderne Ersetzung) zu benutzen. –

Antwort

5

Wenn Sie Ihren Code unter Windows 10 ausführen, wird 2 zurückgegeben, also ERROR_FILE_NOT_FOUND.

Ich habe es zu arbeiten, sowohl auf 32-Bit- und 64-Bit-Zielplattformen, indem sie sie zu Ändern dieser:

var 
    ComSpec: string; 
    retval: HINSTANCE; 
begin 
    ComSpec := GetEnvironmentVariable('comspec'); 
    retval := ShellExecute(Handle, nil, PChar(comspec), '/k dir', nil, SW_SHOW); 
    if retval <= 32 then 
    Caption := Format('Error, return value = %d', [retval]) 
    else 
    Caption := 'Success'; 
end; 

Die /k sagt eine neue Instanz von cmd.exe laufen und halten Sie das Fenster geöffnet . Führen Sie für weitere Details cmd /? von einer Eingabeaufforderung aus.

Beachten Sie, dass die Fehlerbehandlung von ShellExecute sehr begrenzt ist. Wenn Sie umfassend nach Fehlern suchen möchten, müssen Sie stattdessen ShellExecuteEx verwenden.

+4

Beachten Sie, dass viele der Fehlercodes, die von 'ShellExecute()' zurückgegeben werden, keine Standard-Win32-Fehlercodes sind. In diesem speziellen Fall passiert es, dass 'ShellExecute() '' s Fehler 2 bedeutet" Datei nicht gefunden ". Wenn Sie sich auf einzelne Fehlercodes verlassen müssen, ist es besser, 'ShellExecuteEx()' stattdessen zu verwenden, da es 'GetLastError()' verwendet, um seinen Fehlercode zu melden. –

Verwandte Themen