Wie Sie eine MS-DOS-batch-Programm aus delphi 2010-Anwendung
Ich versuche eine routine zu schreiben, der ausgeführt wird, eine DOS-batch-Programm aus einem Delphi-2010-Anwendung. Meine alte routine, die funktioniert in Delphi 6 gibt mir immer die Fehlermeldung:-
"Project1.exe ausgelöste exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 7C82F29C in Modul 'kernel32.dll'. Schreiben von Adresse 004A3B82".
Hier ist meine alte routine, die funktioniert in Delphi 6:-
Procedure TForm1.BatchProgramCall;
var
StartInfo: TStartUpInfo;
ProcInfo: TProcessInformation;
createOK: Boolean;
begin
FillChar(StartInfo, SizeOf(TStartUpInfo), #0);
FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
StartInfo.cb := SizeOf(TStartUpInfo);
StartInfo.dwFlags := STARTF_USESHOWWINDOW;
StartInfo.wShowWindow := SW_SHOWMINIMIZED;
createOK := CreateProcess(Nil,PCHAR('SOMEBATCHPROGRAM.BAT'),Nil, Nil, false,
CREATE_NEW_PROCESS_GROUP+HIGH_PRIORITY_CLASS,
NIL, NIL, STARTINFO, PROCINFO);
if createOK then
waitForSingleObject(PROCINFO.HPROCESS, Infinite);
end;
Bitte lassen Sie mich wissen, was mache ich falsch oder gibt es viel bessere Weg zu gehen über diese...
Vielen Dank.
- Suche auf StackOverflow für "[delphi] ShellExecute" oder "[delphi] ShellExecuteEx" bietet Ihnen einige alternativen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lesen Sie diesen Artikel über CreateProcess und die unicode-Probleme.
Delphi in einer Unicode-Welt Teil III: Unicodifying Ihren Code
CreateProcess Erklärung
Die Unicode-version dieser Funktion, CreateProcessW, können Sie den Inhalt von diesem string. Daher dieser parameter kann ein Zeiger auf nur-lese-Speicher (wie eine const-variable oder eine Zeichenkette). Falls dieser parameter eine string-Konstante, gibt die Funktion eine Zugriffsverletzung verursachen.
Können Sie die UniqueString - Funktion als workaround um das problem zu beheben.
Dem Grund, dass Ihre Funktion nicht in Delphi 2010, arbeitet aber in Delphi 6 ist, dass
CreateProcessW()
muss nicht aufgerufen werden, mit einem nur-lese -lpCommandLine
parameter. Zitat der MSDN-Dokumentation:Dem Grund, dass es funktioniert mit Delphi 6 ist, dass alle Windows-Funktionen richtig breit Zeichenfolge intern, und die Ansi-Versionen nichts zu tun, sondern konvertieren string-Parameter, um Ihre wide-string-Pendant, und rufen Sie dann die wide-version. Sie rufen die Funktion mit einer Konstanten, und mit Delphi 6 Windows intern erstellt einen beschreibbaren Puffer für Sie. Mit Delphi 2010 erleben Sie die AV.
Beachten Sie, dass das Programm noch ein Fehler, da die Dokumentation aber auch:
Ich nicht eine ähnliche Sache in Delphi 6, mit viel von deinem code aber etwas anders, ich Frage mich, ob es für Sie arbeiten?
Verwenden: