git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.jvcl@12 7f62d464-2af8-f54e-996c-e91b33f51cbe
125 lines
3.6 KiB
ObjectPascal
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.
|