Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.12.15;
Скачать: CL | DM;

Вниз

Определить консольную программу не запуская ее   Найти похожие ветки 

 
robt5   (2013-06-16 14:35) [0]

как? по импортам ?
нужно отделить чисто консольные, от ГУИно-консольных :)


 
wl ©   (2013-06-16 14:39) [1]

скорее всего в заголовке можно найти что нибудь. попробуй скомпилировать какой нить Hwllo World с опцией /CONSOLE (надеюсь не напутал с опцией для компилятора от MS)  и без нее, и сравнить


 
robt5   (2013-06-16 14:46) [2]

не врятли заголовок поможет, наверно надо искать в импорте какойнить CreateWindow... или без чего не может быть ГУИ...


 
Юрий Зотов ©   (2013-06-16 15:04) [3]

User32.dll в секции импорта ?


 
Дмитрий СС   (2013-06-16 15:11) [4]

Гарантии 100% не будет.


 
wl ©   (2013-06-16 15:16) [5]

почему не будет? потому что из консоли можно вызвать MessageBox?
сама винда однозначно различает консольные и оконные приложения, так что способ все равно есть


 
MBo ©   (2013-06-16 15:19) [6]

>не врятли заголовок поможет
А что ж не глянул даже?
поле subsystem в PE-заголовке


 
Дмитрий СС   (2013-06-16 15:38) [7]


> винда однозначно различает консольные и оконные приложения

Как же интересно?

Вот это какой приложение?


program Project1;
uses
 Windows;

function AttachConsole(ProcessID: DWord): BOOL; stdcall; external kernel32 name "AttachConsole";
const
 ATTACH_PARENT_PROCESS = DWord(-1);

begin
 if not AttachConsole(ATTACH_PARENT_PROCESS) then
   AllocConsole;
 Writeln(ParamStr(0));
 readln;
end.


А вот это?


program Project1;

uses
 Windows,
 Vcl.Forms,
 Unit1 in "Unit1.pas" {Form1};

{$R *.res}

function AttachConsole(ProcessID: DWord): BOOL; stdcall; external kernel32 name "AttachConsole";
const
 ATTACH_PARENT_PROCESS = DWord(-1);

begin
 if not AttachConsole(ATTACH_PARENT_PROCESS) then
   AllocConsole;
 Writeln(ParamStr(0));

 Application.Initialize;
 Application.MainFormOnTaskbar := True;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.


 
Дмитрий СС   (2013-06-16 15:41) [8]

Если ты про то, что некоторые приложения после запуска "освобождают" консоль, а иные ее удерживают до конца своей работы - то это определяется только "на ходу". По началу цикла обработки сообщений windows главного (а может и не только) потока.


 
Dimka Maslov ©   (2013-06-16 17:13) [9]

Dependency Walker делает это, значит можно.


 
Юрий Зотов ©   (2013-06-16 17:20) [10]

> Дмитрий СС   (16.06.13 15:38) [7]
> Вот это какой приложение?

В терминологии ТС, первое - чисто консольное, второе - ГУИно-консольное.


 
antonn ©   (2013-06-16 17:34) [11]


> А вот это?

гуевое это приложение, гуевое...
=)


 
Дмитрий СС   (2013-06-16 20:07) [12]

А если поставлю зависимость от параметров? Какое это тогда приложение?


 
robt5   (2013-06-16 20:17) [13]


> поле subsystem в PE-заголовке

в принципе да, пишет что типа консольное для чисто консольных :)


 
robt5   (2013-06-16 21:26) [14]

хотя это всего лишь флаг для винды для автоматического создания консоли
такчто тоже не 100%


 
DVM ©   (2013-06-16 21:59) [15]

Да никак не отличить. GUI приложение может импортировать функции создания консоли и никогда ее не показать, а может и показать. Аналогично консольное приложение может содержать скрытые окна, например для сокетов на сообщениях и т.д. Вариантов миллион.


 
palva ©   (2013-06-20 21:30) [16]

GUI приложение может выглядеть как консольное, но оно не является консольным. У консольного должны быть in out err, которые при запуске доступны операционной системе. Она использует их при отработке символов командной строки < > << >> |
Например, настоящее консольное приложение может выступать как CGI программа, похожее на консольное - не может.


 
Rouse_ ©   (2013-06-20 22:06) [17]

Консольное приложение определяется флагом в заголовке PE файла.
Если данного флага нет - приложение не консольное, точка.


 
[ВладОшин] ©   (2013-06-21 10:19) [18]


> Если данного флага нет - приложение не консольное, точка.

Необходимость есть.
А достаточности, наверное, и быть не может.


 
Дмитрий СС   (2013-06-21 12:25) [19]

Типичное программистское мышление:)


 
han_malign   (2013-06-21 14:44) [20]


> Вот это какой приложение?
...
>   if not AttachConsole(ATTACH_PARENT_PROCESS) then
>     AllocConsole;

- это порнографическое приложение, т.к. будучи прицеплено к родительскому консольному окну - оно умеет туда только срать(т.к. ничто не мешает запустить в контексте одной консоли десяток таких приложений)...

Единственный более менее приемлимый вариант реализации двойного интерфейса - это честная консоль с самоперезапуском CreateProcess(..., DETACHED_PROCESS, ...) и ветвлением по (GetConsoleWindow() = 0)...


 
Leonid Troyanovsky ©   (2013-06-22 16:12) [21]


> han_malign   (21.06.13 14:44) [20]

> Единственный более менее приемлимый вариант реализации двойного

Это два приложения - одно консольное, второе гуевое.

2TS: See SHGetFileInfo with SHGFI_EXETYPE

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2013.12.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
15-1372493135
картман
2013-06-29 12:05
2013.12.15
забыл музыку


15-1370961930
Excel Master
2013-06-11 18:45
2013.12.15
Excel VBA


3-1294523297
den945
2011-01-09 00:48
2013.12.15
Обработка Excel в Delphi


1-1319621779
IGray
2011-10-26 13:36
2013.12.15
Как сравнить два XML-документа?


15-1371760203
Юрий
2013-06-21 00:30
2013.12.15
С днем рождения ! 21 июня 2013 пятница