Блогът на GunSmoker (преводи) Как мога да напиша програма, която да работи като конзола или

. когато промяната на нечий ум става толкова лесна, колкото програмирането на компютър, какво означава да си човек.

Как мога да напиша програма, която може да работи като конзола или като GUI приложение?

Не можете, но можете да фалшифицирате това поведение.

Всяко PE приложение съдържа поле в заглавката си, което определя за коя подсистема е направено това приложение. Можете да кажете IMAGE_SUBSYSTEM_WINDOWS_GUI там, за да посочите, че сте GUI приложение. Или можете да си поставите етикет IMAGE_SUBSYSTEM_WINDOWS_CUI, казвайки, че сте конзолно приложение. Ако сте GUI програма, тогава стартирате без конзола.

Подсистемата определя как ядрото трябва да подготви работната среда за програмата. Ако програмата е маркирана като конзола, ядрото ще свърже конзолата на програмата с конзолата на родителя (повикващия) или ще създаде нова конзола, ако родителят няма конзола (това не е пълно описание, но подробностите тук не са важни). От друга страна, ако програмата е маркирана като GUI, тогава ядрото ще стартира програмата изобщо без конзола.

Има хора, които искат да напишат това, което аз наричам „опортюнистичен конзолен софтуер“. Такива програми ще използват конзолата, ако родителят я има, но не искат конзола, ако родителят не я има. Ядрото не поддържа този тип програма, но това не пречи на хората да измислят хитри решения. Имайте предвид, че ако съществува такъв тип програма, това би създало проблеми с програми като cmd.exe и Explorer, които променят поведението си в зависимост от типа на подсистемата на програмата. Би било необходимо да се модифицират тези програми, които сега трябва да разберат нов тип програма: "и двете системи".