Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Дмитрий77
Member

Откуда:
Сообщений: 4343
Пока программно тему не копал.
Есть идея утилитки.
Смысл, чтоб она могла запускаться и в режиме консоли, и в режиме "НЕ консоли", в зависимости от параметра командной строки.

Консоль нужна например если
1) делать туда вывод событий
2) если запуск в режиме bat-файла, то он будет ждать завершения и только потом переходить к след. команде

Консоль НЕ нужна например если
1) вывод в нее не нужен
2) черное ее окно на экран не нужно
и т.д.

О GUI типа формы на экран речь не идет, форму можно вызвать из main() и для консольного приложения, речь не об этом.

Грубо, хочу так (в свойствах проекта предположительно "Приложение Win Form + Sub Main")
Sub main()
   If InStr(Command, "/Console") Then
      'Поведение эквивалентное типу "Консольное приложение" в свойствах проекта
      'запускаем консоль, делаем действия выводим в консоль... (!!! bat-файл будет ждать завершения)
    Else
      'НЕ запускаем консоль, делаем действия (!!! bat-файл ждать НЕ будет)
    End If
End Sub


МОЖНО или НЕ МОЖНО?

2 проекта не хочу, там очень много всего а логика одинаковая (что с консолью, что без), сложно будет потом "параллельно поддерживать".
14 май 19, 23:43    [21884846]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4401
Дмитрий77, Create page allocconsole (kernel32) ? может сработает
15 май 19, 00:33    [21884856]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Краткий ответ - нет (если не использовать нативный Win API, про который выше упоминали). А зачем это надо? Нельзя ли просто отделить функционал от UI и сделать к нему две разные морды - одну консольную, а другую GUI?
15 май 19, 05:03    [21884892]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
buser
Дмитрий77, Create page allocconsole (kernel32) ? может сработает
он же сказал что о ГУИ и формах речи не идет.
Я сам теряюсь что ему нужно)
15 май 19, 07:07    [21884907]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Дмитрий77
Консоль НЕ нужна например если
1) вывод в нее не нужен
2) черное ее окно на экран не нужно
и т.д.

Ты опиши что нужно мил человек.
А то выражение: "мне нужен НЕ ХЛЕБ" очень широко трактуется)
15 май 19, 07:09    [21884908]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Дмитрий77
2 проекта не хочу, там очень много всего а логика одинаковая (что с консолью, что без), сложно будет потом "параллельно поддерживать".
вот и не мудри.
Не может быть два проекта одинаковых чтобы их запускать по ключику консоль/не консоль.
Забудь. Тут даже постановка не катит.
15 май 19, 07:11    [21884910]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Дмитрий77
Member

Откуда:
Сообщений: 4343
fkthat
Краткий ответ - нет (если не использовать нативный Win API, про который выше упоминали).

м-м-м
счас глянул свои старые VB6 коды, именно так и было сделано одно из приложений
  str_Command = Command
  the_ConsoleMode = IIf(HasOptionFromStr(str_Command, "NoConsole"), False, True)
  If the_ConsoleMode Then
    'создаём консоль
    AllocConsole
    'получаем дескрипторы ввода и вывода
    hOutput = GetStdHandle(STD_OUTPUT_HANDLE)
    hInput = GetStdHandle(STD_INPUT_HANDLE)
  End If

А когда переписывал на .Net от API отказался в пользу "Консольное приложение".
И вилку эту убил.
Видимо придется реанимировать.
15 май 19, 07:13    [21884911]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Дмитрий77,
Именно бейсик и именно старые подходы. Денег за это счас не платят.
15 май 19, 07:17    [21884912]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Дмитрий77,

Тут проблема в том, что у тебя, очень похоже, изначально через джоппу сделано. А именно логика перемешана с UI. Если бы это было разделено, хотя бы логически в пределах одного приложения, то логику легко было бы вынести в отдельную сборку и использовать в двух разных аппликухах с разными UI (GUI и CLI). Ты, вот, через неделю еще и веб-интерфейс захочешь - и что, еще и веб-сервер станешь встраивать в свое приложение вместе с GUI и консолью? Начни лучше с рефакторинга того, что есть.
15 май 19, 08:42    [21884939]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Дмитрий77,

Не может. Флаг отвечающий за это находится в PE заголовке

AllocConsole применить можно, но могут быть проблемы с перенаправлением ввода-вывода

Чистый вариант - приложение делать консольным, если требуют флаги - создавать новый процесс и завершать текущий (естественно два exe потребуется, но это не страшно, основной код в dll должен располагаться
Второму exe можно изменить расширениие, .bin например.)

Недостатки - консольное окно на короткое время будет показываться и id процесса изменится

PS. бейсик и подходы ни причём
15 май 19, 08:52    [21884942]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Изопропил
бейсик и подходы ни причём
да. Переборщил с целью, чтобы автор отказался от этой идеи. Она тут вроде уже второй раз за пару лет проскакивает.
15 май 19, 08:57    [21884948]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
dvim
Member

Откуда: Санкт Петербург
Сообщений: 657
fkthat
А именно логика перемешана с UI.

Пост автора не о этом...
А о том что он хочет возможность делать невидимую консоль

Автору: Есть немало советов и примеров на тему того, как скрыватть консольное окно через winApi
15 май 19, 09:04    [21884953]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
dvim
невидимую консоль
вот расскажи. Я правда не видел. Что то схожее с винсервисом?
15 май 19, 09:37    [21884982]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
dvim
Member

Откуда: Санкт Петербург
Сообщений: 657
Petro123,
Скорее он хочет, чтобы программа отрабатывала, ничего не показывая на экране.
Все таки винсервис - он не совсем для этого.


15 май 19, 09:59    [21885003]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
dvim,
Экран в консоли не программы а винды. Пусть не выводит туда ничего.
Что за блажь такая?
Некоторые ведь запрещают копировать текст мышкой в браузере.
Вы считаете это правильно?
15 май 19, 10:05    [21885006]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
fkthat
Member

Откуда:
Сообщений: 1143
dvim
А о том что он хочет возможность делать невидимую консоль


ОМГ. Зачем может быть нужна невидимая консоль??? Давайте тогда уж сразу сделаем невидимое приложение Если для логирования, то разумнее просто сделать логирование в файл или куда-нибудь еще.
15 май 19, 10:10    [21885010]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Petro123
dvim
невидимую консоль
вот расскажи. Я правда не видел. Что то схожее с винсервисом?
не

Если консольное приложение создает окно,
окно консоли продолжает отображаться что не очень красиво,
Да и юзер может случайно завершить приложение закрыв консольное окно

PS
При сокрытии консольного окна нужно убедиться, что у него нет родителя
15 май 19, 10:26    [21885023]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Изопропил
Если консольное приложение создает окно,
а зачем?
15 май 19, 10:28    [21885028]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Изопропил,
Я понимаю так, что консольное выводит в выходной поток.
15 май 19, 10:29    [21885031]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
fkthat
Зачем может быть нужна невидимая консоль???

Чтоб GUI рисовать отдельно
15 май 19, 10:30    [21885035]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Изопропил
fkthat
Зачем может быть нужна невидимая консоль???

Чтоб GUI рисовать отдельно
пример то есть из гугла? Дайте.
15 май 19, 10:31    [21885037]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Petro123
Изопропил
Если консольное приложение создает окно,
а зачем?
топикстартер хочет написать универсальное приложение консоль/GUI
15 май 19, 10:33    [21885040]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Изопропил
топикстартер хочет написать универсальное приложение консоль/GUI
пример которого отсутствует в гугл картинки.
Поздравляю.
Он запретил мышкой копировать текст на своем сайте.
Удачи ему.
15 май 19, 10:35    [21885041]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3351
уже обсуждали эту тему и не 1 раз в этом разделе
https://www.sql.ru/forum/1305732/konsolnoe-prilozhenie-nuzhen-sovet?hl=console winforms
15 май 19, 10:37    [21885044]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Roman Mejtes,
Да. Точно. Было)
Раз в год.
Я кстати из винФормс подавляю окно консоли runSql.exe.
Но это совсем другое дело.
15 май 19, 10:40    [21885047]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Petro123
Изопропил,
Я понимаю так, что консольное выводит в выходной поток.

Есть ещё Console API
15 май 19, 10:45    [21885054]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Изопропил,
Ну через него наверно из гуи и скрывают окно с забором ответов к себе.
15 май 19, 10:49    [21885059]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Petro123,

Ты о псевдоконсоли?

В любом случае в ветке winforms это оффтоп
15 май 19, 11:12    [21885076]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2665
Дмитрий77
2 проекта не хочу, там очень много всего а логика одинаковая (что с консолью, что без), сложно будет потом "параллельно поддерживать".


Так можно сделать, придется повозиться с разделением, если еще не сделано.
Я не так давно делал аналогичную фигню, т.е. добавлял к уже работающему винформс приложению - возможность быть запущенным как консольное с командной строкой, в бат файле и т.д.
Например, у меня торчали MessageBox на эксцепциях на каждом шагу, пришлось сделать в лог файл, если запущено в консольном режиме и тд.
Тут даже тема была, кстати
15 май 19, 11:18    [21885082]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Ролг Хупин,
Ну, по всему приложению считай нужно писать в каком режиме оно работает.
ЧудоЮдоРыбаКит.
15 май 19, 11:23    [21885088]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Изопропил
топикстартер хочет написать универсальное приложение консоль/GUI


Я же и предлагаю туда еще встроить веб, мобайл на ксамарине, и UWP-версию. Будет не просто универсальное, а сверхуниверсальное приложение. И главное, еще не забыть "как мне все это засунуть в один екзешник" (с)

Говорю же нах автору - раздели сначала логику и UI. Пока у тебя вся логика в баттон-кликах и месседж-боксы напрямую вызывает, то ничего хорошего из такого говнокода все разно не выйдет.
15 май 19, 11:30    [21885094]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Ролг Хупин
Например, у меня торчали MessageBox на эксцепциях на каждом шагу, пришлось сделать в лог файл, если запущено в консольном режиме

Ужоснах

В файл вывод, а не в логгер?
15 май 19, 11:44    [21885105]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Изопропил
Ужоснах


Ну так правильно. У нас же "DI это просто очередная модная тема" (с) Никакие гайдлайны и бестпрактис нихрена не авторитеты - пока самостоятельно граблями по башке не получат, так ничему не научатся.
15 май 19, 12:18    [21885152]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2665
Изопропил
Ролг Хупин
Например, у меня торчали MessageBox на эксцепциях на каждом шагу, пришлось сделать в лог файл, если запущено в консольном режиме

Ужоснах

В файл вывод, а не в логгер?


В логгер, да, log4net
15 май 19, 16:00    [21885474]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Дмитрий77
Member

Откуда:
Сообщений: 4343
Изопропил
Не может. Флаг отвечающий за это находится в PE заголовке

Я понял ответ, спасибо.

Изопропил
AllocConsole применить можно, но могут быть проблемы с перенаправлением ввода-вывода

Не будет проблем. В VB6 так делал. Это нормальный вариант.

Но в .Net будут некоторые непреодолимые издержки (в том числе и при "консольном" через AllocConsole запуске), вот вспомнил свой пост:
Простое приложение без GUI выдает свою активность (песочные часики).

Хотя в данном случае можно забить, в силу специфики кухни этих часиков там и так будет, хоть и из чисто консоли.

Petro123
Я сам теряюсь что ему нужно

Все просто.
Приложение SendFax.exe -размещает задание в MS службу факсов + [опционально отслеживает как идет конкретно процесс отправки этого факса] Через FaxCOMEx ("часиков" на этапе создания задания по любому не избежишь)
На входе куча параметров через cmd: номер, отправляемый документ, + всякие титульные страницы, Sender Info, много там всего.

А "что ему нужно" зависит от хотелок юзера.

Если нужно где-нибудь (в Excel-е, своей проге) щелкнуть кнопку и любоваться как идет/дошел этот самый единственный факс, то подойдет красивое GUI окошко где будет писаться Dialing-Sending page-Retrying и рисоваться свистелки, и консоль нафиг не нужна.

А если например последовательная отправка по списку,
то например bat-файл с переходом к след. строчке после выполнения предыдущей, и консоль самое то.
Ну опционально можно отслеживать коротким выводом в консоль типа
Dialing...
Sending page 1 of 3
Sending page 2 of 3


Основная сложная логика
1) Грамотная обработка входных параметров cmd - создание задания
2) Опциональная часть с отслеживанием статистики отправки этого задания

Petro123
Ну, по всему приложению считай нужно писать в каком режиме оно работает.

И че, один параметр bConsoleMode=true/false вычисляемый сразу же.
==
В общем слегка конкретизировал, чего конкренто делаю. Пока логикой и GUI отслеживания событий занимаюсь, там посмотрим как сделаю с консоль/не консоль. Суть ответов по существу понял. Спасибо.
15 май 19, 16:28    [21885518]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Dima T
Member

Откуда:
Сообщений: 13673
ИМХО пиши лог в файл, и отдельным приложением визуализация лога хоть в консоль, хоть в контрол. Виндовс умеет оповещать об изменении файла.
15 май 19, 20:13    [21885705]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
fkthat
Member

Откуда:
Сообщений: 1143
Dima T
ИМХО пиши лог в файл, и отдельным приложением визуализация лога хоть в консоль, хоть в контрол. Виндовс умеет оповещать об изменении файла.


Всё намного прозаичнее :))

PS C:\logs> Get-Content .\mylog.txt -Tail 12 -Wait
15 май 19, 20:30    [21885714]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 2665
Вот была полезная ветка
https://www.sql.ru/forum/1305732/konsolnoe-prilozhenie-nuzhen-sovet?hl=console
16 май 19, 08:30    [21885847]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Дмитрий77
Member

Откуда:
Сообщений: 4343
Дошли руки до реализации.
Фигово получается.

Тупо AllocConsole() как я делал в VB6 не катит.
При запуске из bat-файла или cmd оно плодит новую консоль.

Катит (как сперва показалось) вот такой вариант что даже стандартные Console.xxx работают (WinForm+Main()):
  'Console Functions
  Private Declare Function AllocConsole Lib "kernel32" () As Boolean

  Private Const ATTACH_PARENT_PROCESS As Integer = -1

  Private Declare Function AttachConsole Lib "kernel32" (ByVal dwProcessId As Integer) As Boolean
  Private Declare Function FreeConsole Lib "kernel32" () As Boolean

  Sub Main()

    Dim bConsoleMode As Boolean = True

    If bConsoleMode Then

      If AttachConsole(ATTACH_PARENT_PROCESS) = False Then
        AllocConsole()
        Console.WriteLine("AllocConsole")
      Else
        Console.WriteLine("AttachConsole")
      End If

      Console.WriteLine("This is my test string.")
      Console.WriteLine("Это моя тестовая строка. Привет.")
      Console.WriteLine("Press any key to continue . . . ")

      'эту функцию вызываем для того,
      'чтобы консоль не закрылась сразу же
      Console.ReadKey(True)
      FreeConsole()
    Else
      Application.EnableVisualStyles() 'инициализация XP/Vista стиля
      MsgBox("OK")
    End If
  End Sub


При тупо запуске мышкой все OK (AllocConsole).
При вызове из bat-файла тоже все корректно (AttachConsole).

НО При вызове из cmd - фигня какая-то,
AttachConsole вроде срабатывает, вывод идет,
но Console.ReadKey не ловится, вместо этого как бы выразиться, cmd сразу "подставляется под ввод новой команды",
сам мой exe-шник закушен (пока консоль не закроешь),
короче бред-мрак, не годится.

Подкоректировать как то можно?

Обратный вариант с "Консольное приложение" + сразу FreeConsole (если "без консоли") - ну не охота с "Мигалкой консоли".

Компилировать 2 раза (2 разные имени) - можно, но как то некрасиво
(ну понятно, что вообще один код можно сделать и только тип проекта менять перед компиляцией)

В VB6 достаточно было либо просто AllocConsole (и оно корректно присасывалось к родительской консоли при наличии без всякого Attach), либо отсутствие AllocConsole (и оно запускалось как "неконсольное").

Че придумать то?
31 май 19, 04:11    [21898135]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Дмитрий77
Компилировать 2 раза (2 разные имени) - можно, но как то некрасиво
(ну понятно, что вообще один код можно сделать и только тип проекта менять перед компиляцией)
31 май 19, 07:28    [21898157]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Дмитрий77
Компилировать 2 раза (2 разные имени) - можно, но как то некрасиво
(ну понятно, что вообще один код можно сделать и только тип проекта менять перед компиляцией)
msbuild используй
31 май 19, 07:30    [21898158]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Дмитрий77
Member

Откуда:
Сообщений: 4343
Изопропил
Дмитрий77
Компилировать 2 раза (2 разные имени) - можно, но как то некрасиво
(ну понятно, что вообще один код можно сделать и только тип проекта менять перед компиляцией)
msbuild используй

некрасив сам факт, что exe-шника будет 2,
а делать один из другого и ручками недолго (поменять тип проекта + м.б. один параметр в коде ConsoleMode=True/False)
31 май 19, 07:52    [21898168]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Дмитрий77,

Ручками то зачем?
31 май 19, 07:57    [21898174]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Дмитрий77
Пока программно тему не копал.
Есть идея утилитки.
Смысл, чтоб она могла запускаться и в режиме консоли, и в режиме "НЕ консоли", в зависимости от параметра командной строки.
.


Сделать 2 exe файла. Первый в зависимости от параметров патчит ему PE Header и запускает.
31 май 19, 08:52    [21898208]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Eolt
патчит ему PE Header

Где такую траву берут?
31 май 19, 09:13    [21898226]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Изопропил,

а в чем проблема?
31 май 19, 09:13    [21898227]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4820
Eolt
Сделать 2 exe файла. Первый в зависимости от параметров патчит ему PE Header и запускает.

В гугле полно уже готовых программ для патчинга PE-хидера.
А так - можно еще круче: компилировать проект в модули (-target:module), а потом батником в зависимости от через csc эти модули собирать либо в консольную аппликуху, либо в оконную.
31 май 19, 09:32    [21898247]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Dima T
Member

Откуда:
Сообщений: 13673
ИМХО патчить EXE на лету плохая идея, антивирусам точно не понравится, в один прекрасный день они могут просто удалить пропатченный EXE и/или того кто патчит.
31 май 19, 09:42    [21898264]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Dima T
ИМХО патчить EXE на лету плохая идея, антивирусам точно не понравится, в один прекрасный день они могут просто удалить пропатченный EXE и/или того кто патчит.


С чего это им не понравится правка одного байта в заголовке отвечающего за тип приложения?
Если же твой антивирус на такое ругается - то место ему в мусорке (как впрочем и большинству этого байтового хлама).
31 май 19, 09:59    [21898275]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Dima T
Member

Откуда:
Сообщений: 13673
[quot Eolt]
Dima T
Если же твой антивирус на такое ругается - то место ему в мусорке (как впрочем и большинству этого байтового хлама).

Согласен, но попробуй это объяснить админу клиента.
31 май 19, 10:06    [21898280]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Eolt
Изопропил,

а в чем проблема?

1) с readonly носителем, записью в Program Flles
2) запуском нескольких экзкемпляров приложения

PS существование java.exe и javaw.exe не смущает?
31 май 19, 10:52    [21898341]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3351
подписывайте свои продукты ЭЦП, и антивирусы не будут ругаться
31 май 19, 11:33    [21898422]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4820
Roman Mejtes
подписывайте свои продукты ЭЦП, и антивирусы не будут ругаться

Да, только после патчинга хидера ЭЦП превращается в тыкву.
31 май 19, 11:36    [21898429]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Dima T
Member

Откуда:
Сообщений: 13673
Сон Веры Павловны
Roman Mejtes
подписывайте свои продукты ЭЦП, и антивирусы не будут ругаться

Да, только после патчинга хидера ЭЦП превращается в тыкву.

Подпись тоже можно патчить )))

Тут главный минус в том что ЭЦП штука не дешевая.
31 май 19, 12:15    [21898515]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Изопропил
Eolt
Изопропил,

а в чем проблема?

1) с readonly носителем, записью в Program Flles


Есть много решений: AppData, копирование второго экзешника в Temp и т.д.


автор
2) запуском нескольких экзкемпляров приложения

PS существование java.exe и javaw.exe не смущает?


Не вижу никаких проблем
31 май 19, 13:48    [21898739]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Дмитрий77
Member

Откуда:
Сообщений: 4343
Видимо я пока остановлюсь на варианте WinForm + ключ /Console + AllocConsole/AttachConsole.
Это даст возможность безболезненно дописать единую логику в зависимости от Не консоль/Консоль (пока что сделано как "не консоль").

Ну а дальше подумаю.
Либо 2 exe, либо "Консольное приложение" + FreeConsole на старте.

Патчить заголовок - однозначно дурной вариант. ЭЦП Code Signing имеется, в продакшн все подписывается, но причем тут это. От вирусовантивирусов кстати не всегда спасает. Но не об этом речь.

Здесь еще такой важный момент.
Кроме того что "Консольное" рисует черную консоль и чего-то туда пишет, оно еще берет управление на себя до своего завершения.
То которое "GUI" возвращает управление сразу.
Метод с AttachConsole не обеспечивает "корректной консоли" в случае cmd. Т.е. вроде как приаттачились и туда пишет, а управление уже передано в командную строку, даже "Press Any key..." не нажмешь.

К слову, "нормальный вариант" ("Консольное приложение" + FreeConsole на старте) кроме "мелькания консоли", еще и этим требованиям не удовлетворяет. Управление не будет передано в cmd сразу после FreeConsole, консоль будет ждать полного завершения "всех GUI".

Метод с AttachConsole обеспечит невозврат управления ("корректную консоль"),
если его из cmd запускать
start /w proga.exe

Теоретически можно написать маленькую "прокладку" на VB6, где требуемый функционал случайно или нарочно поддерживается.
Прокладка будет играть роль "start /w".
Т.е. если у меня нет ключа /Console, VB6 просто запускает .Net-exe и выходит
Если у меня ключ /Console, то VB6 делает AllocConsole (случайно или нарочно это в VB6 будет работать как грамотный AttachConsole без возврата управления в cmd), запускает .Net-exe которое делает AttachConsole к родительскому VB6 процессу. Но, при этом VB6-прокладка надо думать должна быть запущена до окончания работы .Net-exe (бесконечный цикл с DoEvents с проверкой завершился ли .Net-exe ? Псевдозагрузка процессора из-за цикла уже не есть good).
Ну, естественно, такой вариант не может сильно нравится, хотя он и обеспечит видимость и функциональность требуемого.
31 май 19, 16:07    [21898929]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Дмитрий77
Member

Откуда:
Сообщений: 4343
Дмитрий77
Теоретически можно написать маленькую "прокладку" на VB6, где требуемый функционал случайно или нарочно поддерживается.
случайно или нарочно это в VB6 будет работать как грамотный AttachConsole без возврата управления в cmd

Короче не получится, соврал, забыл, ничего там такого нет и не было и все то же самое.

В VB6 у меня был грубо такой код:
 If the_ConsoleMode Then
    'создаём консоль
    AllocConsole
...
    FreeConsole
  Else
...
  End If

При написании/тестировании это было НЕ консольное приложение, но наличие AllocConsole позволяло тестировать его как консольное на этапе написания.
А под конец делалось вот это:
LINK.exe /EDIT /SUBSYSTEM:CONSOLE {your exe's filename}

Что превращало его в то что в .Net называется тип проекта="Консольное приложение" (в VB6 в проекте это задать нельзя).
После патча AllocConsole/FreeConsole теряют смысл, хотя и не мешают.
И да, был ключ /NoConsole, но он просто отменял вывод в консоль всякой всячины, но даже не закрывал саму консоль и тем более не менял тип приложения.

Исходя из того что хочу сейчас, получается ДА, только 2 exe-шника
1) "WinForm"+Main = а)нету консоли б) GUI в) возврат управления сразу
2) "Консольное приложение"= а)консоль б) вывод в консоль в) возврат управления по завершению

Код естественно единый.
(2) делается из (1) тупо либо сменой типа проекта, либо тем же LINK.exe (что одно и то же).
2 июн 19, 20:55    [21899928]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3351
А чем решение со сменой Subsystem в хеадере не нравится?
2 июн 19, 21:09    [21899934]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Дмитрий77
Member

Откуда:
Сообщений: 4343
Roman Mejtes
со сменой Subsystem в хеадере

Link.exe если что именно это и делает.
Но не на ходу же, вы ж обсуждали выше: подписи (а у меня подписано), антивирусы, очень дурной тон etc.... при этом все равно нужна "прокладка", которая будет решать патчить/не патчить. При этом неконсольная прокладка не приаттачит грамотно к родительской консоли, а консольная будет мигать при запуске вне консоли. Хотя вопрос возврата/невозврата управления через консольную прокладку таки решить можно.

FreeConsole не говоря о "мигалке консоли", не решает проблемы возврата управления.
AttachConsole, наоборот, не решает проблемы НЕвозврата управления.
НЕТ универсального решения.

Я б такой вопрос тут задал.
Как из кода узнать оно "Консольное" или нет (согласно PE заголовку)?
2 июн 19, 22:37    [21899975]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Изопропил
Member

Откуда:
Сообщений: 31123
Дмитрий77,

тип задаётся при компиляции/сборке.

для проктологов - GetModeuleHandle(0) возвращает адрес загруженного образа в памяти,
остаётся прочитать поле Subsystem из COFF заголовка
3 июн 19, 09:58    [21900150]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4820
Дмитрий77
Я б такой вопрос тут задал.
Как из кода узнать оно "Консольное" или нет (согласно PE заголовку)?

Спрашивали уже.
20441353
и следующий пост.
3 июн 19, 10:56    [21900194]     Ответить | Цитировать Сообщить модератору
 Re: Может ли быть Консольным или WinForm в зависимости от параметра?  [new]
Дмитрий77
Member

Откуда:
Сообщений: 4343
Сон Веры Павловны
Дмитрий77
Я б такой вопрос тут задал.
Как из кода узнать оно "Консольное" или нет (согласно PE заголовку)?

Спрашивали уже.
20441353
и следующий пост.

Не слабые простыни, хотя и в моем стиле.
Будет настрой, м.б. поковыряю.
Но в моем случае при трансформации WinForm->Console App видимо проще поменять одну константу в коде bConsole=FalseTrue, чем ее так "вычислять", потратив денек-другой на освоение этой кухни (без освоения не получится, сколько раз еще в VB6 накалывался брав на веру чужие простыни, а они потом годами/через годы стреляли из за какого-нибудь ByRef вместо ByVal).

И потом я еще до конца не решил, как я поступлю с консоль/не консоль, м.б. придет какая оригинальная идея реализации-гибридизации на ум.
Пока что у меня сделан WinForm с ключиком /Console который делает Alloc(Attach)Console. Для тестирования и отладки в обоих режимах этого достаточно (на чем и сосредоточен), для грамотного продакшн не годится о чем говорилось выше.
4 июн 19, 06:12    [21901080]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / WinForms, .Net Framework Ответить