(1) Unter Delphi7 funktioniert die Anweisung "if AttachConsole(ATTACH_PARENT_PROCESS) then" nicht bzw. gibt immer den Wert FALSE zurück.
Die Verwendung von "if Windows.AllocConsole then" funktioniert dagegen schon.
(2) Man kann mit
Code:
Write('>');
ReadLn(Parameter);
einen künstlichen Prompt anzeigen, die Eingabe in die Variable abfangen und diese zielgerichtet auswerten.
(3) Sollte man unbedingt entweder mit einem
Mutex oder per GlobalFindAtom() arbeiten, um den sonst möglichen Start mehrfacher Instanzen des Programms zu blockieren und so insbesondere das Kuddelmuddel einer evt. gleichzeitigen Präsenz von
GUI- und Konsolen-Ausgabe separater Instanzen des Programms zu verhindern
(4) Deshalb Vorschlag:
Code:
program GUIcons;
uses
windows,
Sysutils,
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
const
AppTitle = 'GUIcons'; // irgendetwas Spezifisches als Titel
var
Mutex: THandle;
ConsoleForm: TForm1;
Parameter: shortstring;
begin
Mutex := CreateMutex(nil, True, AppTitle);
if (
Mutex = 0) or (GetLastError = ERROR_ALREADY_EXISTS) then
begin
// Reaktiviere die bereits laufende 1.Programminstanz
SendMessage(HWND_BROADCAST, RegisterWindowMessage(AppTitle), 0, 0);
// und beende sofort die neu gestartete (2.) Programminstanz
end
else
try
Parameter:='';
// gff. eine spezifische Parameteranalyse
if paramcount = 0 then
begin
if Windows.AllocConsole then
try
ConsoleForm := TForm1.Create(nil);
WriteLn;
// irgendeine sinnvolle Information, z.B.:
WriteLn('Usage: GUIcons <Parameter>');
WriteLn('Fortsetzung mit <ENTER>');
write('> ');
readln(Parameter);
finally
ConsoleForm.Free;
FreeConsole;
end;
end
else parameter:=paramstr(1);
// ggf. prüfen, ob doch noch benötigter Parameter eingegeben wurde,
// z.B. Parameter "/open"
if Uppercase(Parameter)='/OPEN' then
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end
finally
CloseHandle(
Mutex);
end;
end.
Eine grundsätzliche Frage ist aber, wozu denn überhaupt der Klimmzug mit der Konsolenausgabe sinnvoll sein soll, wenn man die gleiche Information problemlos und diese viel besser und ansprechender noch vor der Initialisierung der Mainform mittels Showmessage() anzeigen kann, ohne ggf. zwangsläufig dann die Mainform öffnen zu müssen.