![]() |
Selbst entpackendes Archiv auspacken
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe ein selbstentpackendes Archiv (programm.exe), welches ich mit Delphi/Windows Mitteln auspacken will. Das scheint aber weder mit ShellExecuteAndWait, noch mit WaitForSingleObject zu klappen. Kennt jemand eine Lösung? |
AW: Selbst entpackendes Archiv auspacken
Zitat:
Mit normalem ShellExecute oder auch erstmal billig direkt im Explorer funktioniert es aber? |
AW: Selbst entpackendes Archiv auspacken
Zitat:
Delphi-Quellcode:
bzw.
ShellExecuteAndWait(Application.Handle, 'open', PChar(fName), NIL, Nil, SW_SHOW, True);
Delphi-Quellcode:
Function ExecAndWait(Filename, Params: String;
WindowState: Word = SW_SHOWNORMAL): boolean; var {$IFDEF UNICODE} ShExecInfoW: SHELLEXECUTEINFOW; {$ENDIF} ShExecInfoA: SHELLEXECUTEINFOA; // MSDN: ShellExecuteEx, ShellExecuteInfo Win32IsUnicode : Boolean; begin Result := false; Win32IsUnicode := False; if (Filename = '') {or not FileExists(FileName)} then exit; {$IFDEF UNICODE} if Win32IsUnicode then begin ShExecInfoW.Wnd := GetForegroundWindow; ShExecInfoW.cbSize := SizeOf(SHELLEXECUTEINFOW); ShExecInfoW.fMask := SEE_MASK_NOCLOSEPROCESS; ShExecInfoW.lpVerb := 'open'; ShExecInfoW.lpFile := PWideChar(WideString(Filename)); ShExecInfoW.lpParameters := PWideChar(WideString(Params)); ShExecInfoW.lpDirectory := PWideChar(WideString(ExtractFileDir(Filename))); ShExecInfoW.nShow := WindowState; Result := ShellExecuteExW(@ShExecInfoW); try if Result then WaitForSingleObject(ShExecInfoW.hProcess, INFINITE); finally CloseHandle(ShExecInfoW.hProcess); end; end else {$ENDIF} begin ShExecInfoA.Wnd := GetForegroundWindow; ShExecInfoA.cbSize := sizeof(SHELLEXECUTEINFOA); ShExecInfoA.fMask := SEE_MASK_NOCLOSEPROCESS; ShExecInfoA.lpVerb := 'open'; ShExecInfoA.lpFile := PAnsiChar(AnsiString(Filename)); ShExecInfoA.lpParameters := PAnsiChar(AnsiString(Params)); ShExecInfoA.lpDirectory := PAnsiChar(AnsiString(ExtractFileDir(Filename))); ShExecInfoA.nShow := WindowState; Result := ShellExecuteExA(@ShExecInfoA); try if Result then WaitForSingleObject(ShExecInfoA.hProcess, INFINITE); finally CloseHandle(ShExecInfoA.hProcess); end; end; end; |
AW: Selbst entpackendes Archiv auspacken
Die wichtige Frage ist hier wohl wirklich erstmal: Geht es denn ganz normal "programm.exe" aus dem Explorer zu starten? Wenn dort die gleiche Fehlermeldung erscheint, würde ich fast tippen, dass "programm.exe" ein 16-Bit Executable ist. Dies ist imho spätestens unter Win7 nicht mehr ausführbar.
|
AW: Selbst entpackendes Archiv auspacken
Wer hat denn den Code verbrochen? :shock:
Delphi-Quellcode:
Darum geht das einfach so
// Das sollte auch so irgendwo definiert sein
{$ifdef UNICODE} SHELLEXECUTEINFO = SHELLEXECUTEINFOW; {$else} SHELLEXECUTEINFO = SHELLEXECUTEINFOA; {$end}
Delphi-Quellcode:
Function ExecAndWait( const Filename, Params: String; WindowState: Word = SW_SHOWNORMAL): boolean;
var ShExecInfo: SHELLEXECUTEINFO; // MSDN: ShellExecuteEx, ShellExecuteInfo begin Result := false; if ( Filename = '' ) {or not FileExists( FileName )} then exit; // Exception wäre hier besser, aber nun ShExecInfo.Wnd := GetForegroundWindow; ShExecInfo.cbSize := sizeof( SHELLEXECUTEINFO ); ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS; ShExecInfo.lpVerb := 'open'; ShExecInfo.lpFile := PChar( Filename ); ShExecInfo.lpParameters := PChar( Params ); ShExecInfo.lpDirectory := PChar( ExtractFileDir( Filename ) ); ShExecInfo.nShow := WindowState; Result := ShellExecuteEx( @ShExecInfo ); try if Result then WaitForSingleObject( ShExecInfo.hProcess, INFINITE ); finally CloseHandle( ShExecInfo.hProcess ); end; end; |
AW: Selbst entpackendes Archiv auspacken
Zitat:
Was man aber in einem Delphi seit 2009 eh vergessen kann, da es dort sowieso nicht mehr läuft. Und mindestens seit NT, was dieses Jahr nun seinen 20. Geburtstag gefeiert hatte, ist Windows schon voll auf Unicode. (selbst für Windows 9x gab es das ![]() Aber da die Parameter eh auf "string" deklariert sind, auf das Define UNICODE geeprüft wird, und somit sowieso mindestens Delphi 2009 benötigt würde, ist das ganze natürlich totaler Schwachsinn, da man, wie du schon zeigtest, die Unschaltung auch gleich vom Compiler erledigen lassen kann. Wobei ich Diese eigentlich versucht hatte zu übersehen. Wollte erstmal abwarten, ob oder bis meine andere Frage auch beantwortet wurde, denn funktionieren sollte der Code zumindestens. |
AW: Selbst entpackendes Archiv auspacken
Zitat:
![]() |
AW: Selbst entpackendes Archiv auspacken
Zitat:
|
AW: Selbst entpackendes Archiv auspacken
Zitat:
|
AW: Selbst entpackendes Archiv auspacken
Zitat:
Zitat:
Einzige Möglichkeit ist, ohne das SFX-Modul zu arbeiten, sprich mit einem normalen Unzipper zu arbeiten. Wie das Archiv an das SFX Modul angehängt ist, müsste man dafür ggf. prüfen, wenn es nicht direkt gefunden wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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