Componentes.Terceros.jvcl/official/3.36/install/JVCLInstall/JVCLCmdStarter.dpr
2009-02-27 12:23:32 +00:00

125 lines
3.6 KiB
ObjectPascal

{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JVCLCmdStarter.dpr, released on 2008-11-03.
The Initial Developer of the Original Code is Andreas Hausladen
Portions created by Andreas Hausladen are Copyright (C) 2008 Andreas Hausladen
All Rights Reserved.
Contributor(s):
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id$
program JVCLCmdStarter;
{$APPTYPE CONSOLE}
{ JVCLCmdStarter is used to get the JVCLInstaller into the forground under Windows Vista.
Under Vista a GUI application will be send to the back if it is started from a console window
that is closing after triggering the start of the GUI application.
JVCLCmdStarter waits until the GUI application is idle and then terminates. It is also
a replacement for Windows's "start" command. }
uses
Windows;
{.$R CommCtrlAsInvoker.res}
function SysErrorMessage(ErrorCode: Cardinal): string;
var
Buffer: array[0..1024] of Char;
var
Len: Integer;
begin
Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS or
FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer, Length(Buffer), nil);
while (Len > 0) and ((Buffer[Len - 1] <= #32) or (Buffer[Len - 1] = '.')) do
Dec(Len);
SetString(Result, Buffer, Len);
end;
var
P: PChar;
InStr: Boolean;
ProcessInfo: TProcessInformation;
StartupInfo: TStartupInfo;
S: string;
SecAttr: TSecurityAttributes;
LastError: Cardinal;
begin
P := GetCommandLine;
if P = nil then
begin
WriteLn(ErrOutput, 'GetCommandLine returned NULL');
Halt(1);
end;
InStr := False;
while P[0] <> #0 do
begin
if P[0] = '"' then
begin
if InStr and (P[1] = '"') then
Inc(P)
else
InStr := not InStr;
end
else if (P[0] <= ' ') and not InStr then
Break;
Inc(P);
end;
if P[0] <> #0 then
begin
while (P[0] <> #0) and (P[0] <= #32) do
Inc(P);
end;
if P[0] <> #0 then
begin
S := P;
FillChar(SecAttr, SizeOf(SecAttr), 0);
SecAttr.nLength := SizeOf(SecAttr);
SecAttr.bInheritHandle := True;
FillChar(StartupInfo, SizeOf(StartupInfo), 0);
if CreateProcess(nil, PChar(S), @SecAttr, nil, True, 0, nil, nil, StartupInfo, ProcessInfo) then
begin
CloseHandle(ProcessInfo.hThread);
WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hProcess);
ExitCode := 0;
end
else
begin
LastError := GetLastError;
SetLength(S, 1024);
SetLength(S, FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS or
FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, LastError, 0, PChar(S), Length(S), nil));
WriteLn(ErrOutput, S);
ExitCode := 1;
end;
end
else
begin
WriteLn(ErrOutput, 'No executable specified');
ExitCode := 1;
end;
end.