![]() |
Systemfehler Code 6
Hallo Leute,
ich habe mal ein bisschen ggegoogelt und gelesen, aber nicht wirklich eine Lösung für mein Problem gefunden. ZUm Programm: Ich bin gerade dabei ein Programm zu schreiben, welches nacheinander verschiedene Befehle ausführen soll, ähnlich wie eine Batchdatei. Dabei sollen allerdings die Ereignise, die in dem cmd-Fenster erscheinen auch in ein Memo geschrieben werden als Logbuch. Nun habe ich das Problem, das bei einer Abfolge von Befehlen ein Fehler kommt:
Code:
Der Fehler tritt in folgendem Code auf:
Systemfehler. Code:6.
Das Handle ist ungültig.
Delphi-Quellcode:
Die Funktion wird durch den Klick eines Buttons aufgerufen:
function Tfmain.installcwm:Boolean;
begin fmain.RunCaptured(ExtractFilePath(Application.Exename), 'adb', 'reboot bootloader'); Delay(500); flog.log.Lines.Add('reboot into bootloader'); flog.log.Free; Delay(500); fmain.RunCaptured(ExtractFilePath(Application.Exename), 'fastboot', 'flash recovery cwm.img'); flog.log.Lines.Add('install CWM recovery'); flog.log.Free; Delay(1000); //<-------------------- hier wird der Fehler angezeigt fmain.RunCaptured(ExtractFilePath(Application.Exename), 'fastboot', 'reboot'); Delay(500); result := true; end;
Delphi-Quellcode:
Als Funktion zum ausführen der cmd-Befehle verwende ich den Code, den ich irgendwo hier gefunden habe, ich weiß bloß nicht mehr wo :(
procedure Tfmain.Button3Click(Sender: TObject);
begin if installcwm() = true then begin showmessage('CWM installed successfully!'); end else begin showmessage('Ann error occur. Please show log and see at your phone.'); end; end;
Delphi-Quellcode:
Da die adb.exe als Service gestartet wird, muss ich vorher den Prozess beenden, bevor ich wieder Zugriff auf die marvel.tmp habe. Dazu verwende ich folgenden Code:
function Tfmain.RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean;
var start: TStartupInfo; procInfo: TProcessInformation; tmpName: string; tmp: Windows.THandle; tmpSec: TSecurityAttributes; res: TStringList; return: Cardinal; i,i2:integer; begin Result := False; try { Setze ein Temporäres File } { Set a temporary file } tmpName := 'marvel.tmp'; FillChar(tmpSec, SizeOf(tmpSec), #0); tmpSec.nLength := SizeOf(tmpSec); tmpSec.bInheritHandle := True; tmp := Windows.CreateFile(PChar(tmpName), Generic_Write, File_Share_Write, @tmpSec, Create_Always, File_Attribute_Normal, 0); try FillChar(start, SizeOf(start), #0); start.cb := SizeOf(start); start.hStdOutput := tmp; start.dwFlags := StartF_UseStdHandles or StartF_UseShowWindow; start.wShowWindow := SW_Minimize; { Starte das Programm } if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True, 0, nil, PChar(_dirName), start, procInfo) then begin SetPriorityClass(procInfo.hProcess, Idle_Priority_Class); WaitForSingleObject(procInfo.hProcess, Infinite); GetExitCodeProcess(procInfo.hProcess, return); Result := (return = 0); CloseHandle(procInfo.hThread); CloseHandle(procInfo.hProcess); Windows.CloseHandle(tmp); { Die Ausgaben hinzufügen } if KillProcess(GetProcessID('adb.exe')) = true then begin res := TStringList.Create; output:=''; try res.LoadFromFile(tmpName); for i:= 0 to res.Count-2 do begin if res.Strings[i] = '* daemon not running. starting it now *' then res.Delete(i); end; for i:= 0 to res.Count-2 do begin if res.Strings[i] = '* daemon started successfully *' then res.Delete(i); end; i:=0; IF res.Count <> 0 then begin For i := res.Count - 1 downto 0 do begin IF res.Strings[i] = '' then res.Delete(i); end; end; flog.log.Lines.AddStrings(res); output:=res.Text; finally res.Free; end; end; Windows.DeleteFile(PChar(tmpName)); end else begin Application.MessageBox(PChar(SysErrorMessage(GetLastError())), 'RunCaptured Error', MB_OK); end; except Windows.CloseHandle(tmp); Windows.DeleteFile(PChar(tmpName)); raise; end; finally end; end;
Delphi-Quellcode:
Nun weiß ich nicht wirklich wo denn der Fehler ist. Laut meiner Auffassung müsste es gehen. Hat von euch noch jemand Lösungsansätze?
function tfmain.KillProcess(dwProcID: DWORD):Boolean;
var hProcess : Cardinal; dw : DWORD; begin { open the process and store the process-handle } hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, dwProcID); { kill it } TerminateProcess(hProcess, 0); { TerminateProcess returns immediately, so wie have to verify the result via WaitfForSingleObject } dw := WaitForSingleObject(hProcess, 5000); case dw of WAIT_OBJECT_0: result:=true; { process could not be terminated after 5 seconds } WAIT_TIMEOUT: begin Messagebox(Application.Handle, 'Prozess konnte nicht innerhalb von 5 Sekunden beendet werden.', 'Prozess beenden', MB_ICONSTOP); result:=false; CloseHandle(hProcess); exit; end; { error in calling WaitForSingleObject } WAIT_FAILED: begin RaiseLastOSError; CloseHandle(hProcess); exit; end; end; CloseHandle(hProcess); end; Danke schon mal im voraus. |
AW: Systemfehler Code 6
Hallo,
Zitat:
einbeliebigername. |
AW: Systemfehler Code 6
flog is ein weiters Form, indem das Memo log eingebunden ist ;)
Das ist mir so noch gar nicht aufgefallen, das ich das erst schließe und dann wieder beschreibe :( Neue Funktion ist somit dann:
Delphi-Quellcode:
Ist aber für das Problem keine Lösung :(
function Tfmain.installcwm:Boolean;
begin fmain.RunCaptured(ExtractFilePath(Application.Exename), 'adb', 'reboot bootloader'); Delay(500); flog.log.Lines.Add('reboot into bootloader'); Delay(500); fmain.RunCaptured(ExtractFilePath(Application.Exename), 'fastboot', 'flash recovery cwm.img'); flog.log.Lines.Add('install CWM recovery'); Delay(1000); fmain.RunCaptured(ExtractFilePath(Application.Exename), 'fastboot', 'reboot'); Delay(500); flog.log.Free; result := true; end; |
AW: Systemfehler Code 6
Hallo,
Zitat:
Delphi-Quellcode:
aber ganz verzichten, denn bei jedem Aufruf von Tfmain.installcwm würde das ja freigegeben werden.
flog.log.free;
Zitat:
Und dann bin ich der Meinung das man ein Service nicht über CreateProcess startet, sondern über den Service Control Manager. Und dann hat ein Service auch kein StdOut. einbeliebigername. |
AW: Systemfehler Code 6
Die adb.exe ist kein Windows Service sondern ein zusätzlicher daemon für die Android ENtwicklung. Man kann den Service nur über das starten der adb.exe starten und auch über das Beenden des Prozeses oder durch den adb kill-server befehl beenden.
Ich beende also den Service ganz normal, wie ich es auch per Hand tun würde. Er steigt bei der selben stelle nach dem ausführen von "fastboot flash recovery recovery.img" aus. |
AW: Systemfehler Code 6
Hallo,
Zitat:
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
zweimal aufgerufen wird. Was Windows beim zweiten Aufruf macht weiß ich jetzt nicht. Aber ich könnte mir denkt das es zu deinem Fehler führt. Mach doch mal einen Haltepunkt nach dem except und schau ob er da vorbei kommt. Wenn du damit auch nicht weiterkommst bleibt dir wohl nichts anderes übrig als mal mit F7 durchzudebuggen.
Windows.CloseHandle(tmp)
einbeliebigername. |
AW: Systemfehler Code 6
Das zweite WIndow.CloseHandle(tmp) ist aber in dem Exceptbereich. Wenn ich das richtig in Erinnerung habe, dürften niemals beide Windows.CloseHandle(tmp) ausgeführt werden. Dafür ist es ja da ;)
Dann werde ich wohl mal den Debugger bedienen müssen :pale: Falls noch jemand eine Idee hat, bitte posten ;) |
AW: Systemfehler Code 6
Hallo,
Zitat:
einbeliebigername. |
AW: Systemfehler Code 6
Dann wäre es doch besser, wenn ich das CloseHandle in die finally abschnitt reinschreibe, oder?:thumb:
|
AW: Systemfehler Code 6
Hallo,
Zitat:
einbeliebigername. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz