Определение типа прилолжения
От: Nickolay Ch  
Дата: 30.05.05 15:28
Оценка:
Доброго времени суток всем.
Кто нибудь знает как опредеделить тип исполняемого приложения(консольное , вин32...) программно?
Re: Определение типа прилолжения
От: OldDino Россия  
Дата: 30.05.05 15:40
Оценка:
Здравствуйте, Nickolay Ch, Вы писали:

NC>Доброго времени суток всем.

NC>Кто нибудь знает как опредеделить тип исполняемого приложения(консольное , вин32...) программно?

Знает. Но это, кажется, к .NET не относится.

С уважением,

OldDino
Re[2]: Определение типа прилолжения
От: Nickolay Ch  
Дата: 30.05.05 15:57
Оценка:
Здравствуйте, OldDino, Вы писали:

OD>Здравствуйте, Nickolay Ch, Вы писали:


NC>>Доброго времени суток всем.

NC>>Кто нибудь знает как опредеделить тип исполняемого приложения(консольное , вин32...) программно?

OD>Знает. Но это, кажется, к .NET не относится.


OD>С уважением,


OD>OldDino

Имелось в виду для .нет приложений...
Определение типа прилолжения
От: Аноним  
Дата: 30.05.05 20:24
Оценка:
Я могу ошибаться, но обычно тип приложения прописывается в PE заголовке.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Определение типа прилолжения
От: Аноним  
Дата: 31.05.05 02:44
Оценка: 3 (1)
Ну здесь можно предложить 2 варианта :
1. Если в списке загруженных сборок есть System.Window.Forms.dll — то это очевидно GUI приложение, но это не необязательное условие, так что этот метод не совсем достоверен ( эвристика )

2. Средствами WinAPI получить указатель на заголовок программы и прочитать его, там это написано. Итак нам потребуется:

1) Пара прямых рук.
2) Знание Native API
3) Компиляция программы с директивой unsafe

// Описание структур фаила PE формата
[StructLayout(LayoutKind.Sequential)]
public struct _IMAGE_FILE_HEADER
{
public ushort Machine;
public ushort NumberOfSections;
public uint TimeDateStamp;
public uint PointerToSymbolTable;
public uint NumberOfSymbols;
public ushort SizeOfOptionalHeader;
public ushort Characteristics;
}

[StructLayout(LayoutKind.Sequential)]
public struct _IMAGE_OPTIONAL_HEADER
{
public ushort Magic;
public byte MajorLinkerVersion;
public byte MinorLinkerVersion;
public uint SizeOfCode;
public uint SizeOfInitializedData;
public uint SizeOfUninitializedData;
public uint AddressOfEntryPoint;
public uint BaseOfCode;
public uint BaseOfData;
//
// NT additional fields.
//

public uint ImageBase;
public uint SectionAlignment;
public uint FileAlignment;
public ushort MajorOperatingSystemVersion;
public ushort MinorOperatingSystemVersion;
public ushort MajorImageVersion;
public ushort MinorImageVersion;
public ushort MajorSubsystemVersion;
public ushort MinorSubsystemVersion;
public uint Win32VersionValue;
public uint SizeOfImage;
public uint SizeOfHeaders;
public uint CheckSum;
public ushort Subsystem;
public ushort DllCharacteristics;
public uint SizeOfStackReserve;
public uint SizeOfStackCommit;
public uint SizeOfHeapReserve;
public uint SizeOfHeapCommit;
public uint LoaderFlags;
public uint NumberOfRvaAndSizes;
public _IMAGE_DATA_DIRECTORY DataDirectory1;
public _IMAGE_DATA_DIRECTORY DataDirectory2;
public _IMAGE_DATA_DIRECTORY DataDirectory3;
public _IMAGE_DATA_DIRECTORY DataDirectory4;
public _IMAGE_DATA_DIRECTORY DataDirectory5;
public _IMAGE_DATA_DIRECTORY DataDirectory6;
public _IMAGE_DATA_DIRECTORY DataDirectory7;
public _IMAGE_DATA_DIRECTORY DataDirectory8;
public _IMAGE_DATA_DIRECTORY DataDirectory9;
public _IMAGE_DATA_DIRECTORY DataDirectory10;
public _IMAGE_DATA_DIRECTORY DataDirectory11;
public _IMAGE_DATA_DIRECTORY DataDirectory12;
public _IMAGE_DATA_DIRECTORY DataDirectory13;
public _IMAGE_DATA_DIRECTORY DataDirectory14;
public _IMAGE_DATA_DIRECTORY DataDirectory15;
public _IMAGE_DATA_DIRECTORY DataDirectory16;
}

[StructLayout(LayoutKind.Sequential)]
public struct _IMAGE_DATA_DIRECTORY
{
public uint VirtualAddress;
public uint Size;
}


[StructLayout(LayoutKind.Sequential)]
public struct _IMAGE_NT_HEADERS
{
public uint Signature;
public _IMAGE_FILE_HEADER FileHeader;
public _IMAGE_OPTIONAL_HEADER OptionalHeader;
}

[StructLayout(LayoutKind.Sequential)]
public struct _IMAGE_DOS_HEADER
{
public ushort e_magic; // Magic number
public ushort e_cblp; // Bytes on last page of file
public ushort e_cp; // Pages in file
public ushort e_crlc; // Relocations
public ushort e_cparhdr; // Size of header in paragraphs
public ushort e_minalloc; // Minimum extra paragraphs needed
public ushort e_maxalloc; // Maximum extra paragraphs needed
public ushort e_ss; // Initial (relative) SS value
public ushort e_sp; // Initial SP value
public ushort e_csum; // Checksum
public ushort e_ip; // Initial IP value
public ushort e_cs; // Initial (relative) CS value
public ushort e_lfarlc; // File address of relocation table
public ushort e_ovno; // Overlay number
public uint e_res0; // Reserved words
public uint e_res1; // Reserved words
public ushort e_oemid; // OEM identifier (for e_oeminfo)
public ushort e_oeminfo; // OEM information; e_oemid specific
public long e_res2; // Reserved words
public long e_res3; // Reserved words
public uint e_res4; // Reserved words
public uint e_lfanew; // File address of new exe header
}
// сам код
class ClassMain
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static unsafe int Main(string[] args)
{
_IMAGE_DOS_HEADER* imageDosHeader = (_IMAGE_DOS_HEADER*)GetModuleHandle( null );
_IMAGE_NT_HEADERS* imageNTHeaders = (_IMAGE_NT_HEADERS*)( (uint)imageDosHeader + imageDosHeader->e_lfanew);

Console.WriteLine( "subsystem: {0}", imageNTHeaders->OptionalHeader.Subsystem );
/*
Subsystem values :
*/

switch( imageNTHeaders->OptionalHeader.Subsystem )
{
case 0x3:
Console.WriteLine( "это console" );
break;
case 0x2:
Console.WriteLine( "это gui" );
break;
default:
Console.WriteLine( "мля его знает!" );
break;
}

Console.ReadLine();
return 0;
}

[DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
public extern static unsafe void* GetModuleHandle( string lpModuleName );
}

В принципе этот код можно вынести в отдельную DLL, где специальный класс будет проверять что за приложение, если нельзя, чтобы главный исполняемый фаил компилировался с unsafe.

P.S. Для .NET это хак.
Любое сложное решение — проявление лени человека, которому это поручили


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Определение типа прилолжения
От: 0Z Россия http://www.ucca.ru
Дата: 31.05.05 04:26
Оценка:
Здравствуйте, QuICE, Вы писали:

QIC>1. Если в списке загруженных сборок есть System.Window.Forms.dll — то это очевидно GUI приложение, но это не необязательное условие, так что этот метод не совсем достоверен ( эвристика )


Это точно не прокатит, т.к. я, например, часто кладу формы в отдельные dll-ки. Кроме того, если надо использовать MessageBox в коде, то для этого также нужно подключить System.Windows.Forms.dll.
MCSD.NET << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: Определение типа прилолжения
От: DuШes  
Дата: 31.05.05 05:29
Оценка:
Здравствуйте, Nickolay Ch, Вы писали:

NC>Доброго времени суток всем.

NC>Кто нибудь знает как опредеделить тип исполняемого приложения(консольное , вин32...) программно?

А мне вот интересно, если используется Windows.Forms, есть диалог, но на фоне к примеру консоль — не секрет наверно, что такое делается простым переключением ключа компилятора /target:exe


И к какому типу приложения отнести такое чудо???
Re[2]: Определение типа прилолжения
От: Nickolay Ch  
Дата: 31.05.05 08:37
Оценка:
Здравствуйте, DuШes, Вы писали:

DШ>Здравствуйте, Nickolay Ch, Вы писали:


NC>>Доброго времени суток всем.

NC>>Кто нибудь знает как опредеделить тип исполняемого приложения(консольное , вин32...) программно?

DШ>А мне вот интересно, если используется Windows.Forms, есть диалог, но на фоне к примеру консоль — не секрет наверно, что такое делается простым переключением ключа компилятора /target:exe



DШ>И к какому типу приложения отнести такое чудо???

Определим "консольное приложение", как приложение, у которого есть консоль
(Не важно, есть ли у него форма или нет.)
Re: Определение типа прилолжения
От: Аноним  
Дата: 31.05.05 09:47
Оценка:
А 2 метод?
Любое сложное решение — проявление лени человека, которому это поручили


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Определение типа прилолжения
От: 0Z Россия http://www.ucca.ru
Дата: 31.05.05 19:02
Оценка:
Здравствуйте, QuICE, Вы писали:

QIC>А 2 метод?


хз, наверное сработает, идея хорошая
MCSD.NET << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re: Определение типа прилолжения
От: EM Великобритания  
Дата: 31.05.05 20:47
Оценка:
Здравствуйте, Nickolay Ch, Вы писали:

NC>Доброго времени суток всем.

NC>Кто нибудь знает как опредеделить тип исполняемого приложения(консольное , вин32...) программно?



System.Reflection.Emit.PEFileKinds
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[2]: Определение типа прилолжения
От: EM Великобритания  
Дата: 31.05.05 21:33
Оценка:
Здравствуйте, EM, Вы писали:

EM>Здравствуйте, Nickolay Ch, Вы писали:


NC>>Доброго времени суток всем.

NC>>Кто нибудь знает как опредеделить тип исполняемого приложения(консольное , вин32...) программно?



EM>
EM>System.Reflection.Emit.PEFileKinds
EM>



Сорри, ошибся, этот енум не из той оперы.
Проверить можно так : для консольного приложения (у которого нет форм) будет

Process.GetCurrentProcess().MainWindowHandle == 0


А откуда вообще такая задача, ежели не секрет ?
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
Re[3]: Определение типа прилолжения
От: OldDino Россия  
Дата: 01.06.05 05:18
Оценка:
Здравствуйте, Nickolay Ch, Вы писали:

NC>Здравствуйте, OldDino, Вы писали:


OD>>Здравствуйте, Nickolay Ch, Вы писали:


NC>>>Доброго времени суток всем.

NC>>>Кто нибудь знает как опредеделить тип исполняемого приложения(консольное , вин32...) программно?

OD>>Знает. Но это, кажется, к .NET не относится.


OD>>С уважением,


OD>>OldDino

NC>Имелось в виду для .нет приложений...

Я полностью согласен с dreamer.mas и QuICE. Всё остальное — от лукавого.

С уважением,

OldDino
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.