• uinor (24.09.09 22:09) [0]
    Понимаю, что наркоманство, но требуется реализовать оба режима (GUI & Console) в одной программе, при этом основным режимом является GUI, но в случае, если есть параметры командной строки, то выводим все в консоль.

    Своя консоль - это легко. Требуется сделать вывод в родительскую.

    Реализовал следующим образом (понимаю, что минимум Windows XP):
    var
     ConsoleOutput: Boolean;
     AttachConsole: function(dwProcessId: Cardinal): Boolean; stdcall;

    procedure WriteConsole(const AOutputStr: string);
    begin
     if WriteLog then
       WriteLn(AOutputStr)
     else
       ... skipped ...
    end;

    begin
     if (ParamCount > 0) then
     begin
       // Пробуем наладить консоль
       ConsoleOutput := False;
       AttachConsole := GetProcAddress(GetModuleHandle('kernel32.dll'), 'AttachConsole');
       if (@AttachConsole <> nil) then
         ConsoleOutput := AttachConsole($FFFFFFFF);

       WriteLog('Console Mode!');
     end else
     begin
       Application.Initialize;
       Application.MainFormOnTaskbar := True;
       Application.Title := 'Requte';
       Application.CreateForm(TfrmMain, frmMain);
       Application.Run;
     end;
    end.



    Все нормально. Но есть небольшая проблема - когда мы выполняем cmd myApp.exe >myApp.log получаем i/o exception на WriteLn.

    Интуитивно, я понимаю, что надо решать как-то иначе, уж слишком в лоб решение. Подскажите?
  • uinor (24.09.09 22:10) [1]
    procedure WriteLog(const AOutputStr: string);
    begin
    if (ConsoleOutput) then
      WriteLn(AOutputStr)
    else
      ... skipped ...
    end;



    Поправочка. Приношу свои извинения, код правил прямо здесь.
  • Leonid Troyanovsky © (25.09.09 08:06) [2]

    > uinor   (24.09.09 22:09)  

    > Все нормально. Но есть небольшая проблема - когда мы выполняем
    > cmd myApp.exe >myApp.log получаем i/o exception на WriteLn

    Похоже на косяк by M$.

    > Интуитивно, я понимаю, что надо решать как-то иначе

    Правильно понимаешь.
    Ничего лучше, чем написать два приложения не придумали.
    И МС так делает.

    В крайнем случае 3: - сервер и 2 клиента.

    --
    Regards, LVT.
  • uinor (25.09.09 08:17) [3]
    @Leonid Troyanovsky
    Целиком с вами согласен.
Есть новые Нет новых   [134434   +26][b:0][p:0.001]