ИНФОРМАЦИЯ: Вызов подпрограммы CRT вывода из графического интерфейса пользователя приложения

Переводы статьи Переводы статьи
Код статьи: 105305 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Аннотация

Чтобы использовать библиотеку времени выполнения c выхода подпрограммах printf() из графического интерфейса пользователя приложения, это необходимо для создания консоли. Приложения Win32 интерфейс программирования (API) AllocConsole() создает консоли. Библиотека CRT Плановое setvbuf() удаляет буферизации таким образом, вывод отображается немедленно.

Этот метод работает, если запустить графический Интерфейс приложений из командной строки или из диспетчера файлов. Однако этот способ не работает, если приложение запустить диспетчер программ или с помощью команды «Пуск». Ниже код показан способ решения проблемы:
   int hCrt;
   FILE *hf;

   AllocConsole();
   hCrt = _open_osfhandle(
             (long) GetStdHandle(STD_OUTPUT_HANDLE),
             _O_TEXT
          );
   hf = _fdopen( hCrt, "w" );
   *stdout = *hf;
   i = setvbuf( stdout, NULL, _IONBF, 0 );
				
Этот код открывает новый дескриптор низкого уровня CRT правильный консоли вывода дескриптор, связывает новый поток с низкоуровневыми дескриптора и заменяет с помощью этого нового потока STDOUT. Этот процесс берет на себя функции, использующие stdout, такие как printf(), puts() и т. д. Используйте ту же процедуру для STDIN и stderr.

Обратите внимание на то, что этот код не устраняет проблему с маркерами, 0, 1 и 2. В факт, из-за других сложностей не удается исправить это, и Поэтому необходимо использовать вместо ввода-вывода низкого уровня потока ввода-вывода.

Дополнительная информация

При запуске графического интерфейса пользователя приложения с помощью команды «Пуск», три обрабатывает стандартной операционной системы STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, и STD_ERROR_HANDLE все «обнуление» по инициализации консоли подпрограммы. Эти три маркеры заменяются на допустимые значения, если графический интерфейс пользователя приложение вызывает метод AllocConsole(). Таким образом после этого вызова GetStdHandle() всегда будет возвращать значения допустимого дескриптора. Проблема в том, что библиотека CRT завершения инициализации перед приложение получает возможность вызывать AllocConsole(); есть три низкой дескрипторы ввода-вывода 0, 1 и 2 уже были настроены для использования исходного обнуление дескрипторов ОС, так что все CRT Ввод-вывод отправляется на неверные дескрипторы операционной системы и вывода CRT не отображается в консоль. Используйте метод обхода, описанные выше, для устранения этой проблемы.

В случае использования, запуск из командной строки без графического интерфейса пользователя приложения Команда «Пуск», стандартный, дескрипторы операционной системы не обнуление правильно, но неправильно наследуются от CMD.EXE-ФАЙЛА. Когда приложения CRT Выполняет инициализацию, три низкой дескрипторы ввода-вывода 0, 1 и 2 инициализируются с помощью Дескриптор три числа, которые приложение наследует CMD.EXE-ФАЙЛА. Когда приложение вызывает метод AllocConsole(), консоль процедуры инициализации Попробуйте заменить инициализацию консоли считает недопустимым Стандартная ОС обрабатывать значения со значениями допустимым дескриптором из новой консоли. По совпадение, поскольку процедуры инициализации консоли склонны разглашать те же три значения для стандартных дескрипторов операционной системы консоли Инициализация приведет к замене стандартных значений дескриптор операционной системы с одинаковыми значения, которые были там до--из них унаследованы от CMD.EXE-ФАЙЛА. Таким образом, В этом случае работает ввода-вывода CRT.

Важно понимать, что возможность использования процедуры CRT из графического интерфейса пользователя приложение, запустите из командной строки не было разработки так, чтобы это не возможно Работа в будущих версиях Windows NT или Windows. В будущей версии, может потребоваться временное решение не только для приложения, запущенные на команды Начато строки с «начало <application name="">», но также для приложений Командная строка именем «приложения». </application>

Свойства

Код статьи: 105305 - Последний отзыв: 1 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Win32 Application Programming Interface на следующих платформах
    • Microsoft Windows 98 Standard Edition
    • операционная система Microsoft Windows Millennium Edition
Ключевые слова: 
kbconsole kbinfo kbkernbase kbmt KB105305 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:105305

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com