Минимальная программа для Windows

Статус: думаю над проектом.Здравствуйте. Меня зовут Артём и я представляю Вам мой блог и портфолио, в котором я буду показывать Вам то, чем я занимаюсь, и рассказывать о том что думаю. Более полная информация обо мне.

Подписка на Email

Присоединиться к еще 4 подписчикам

Свежие записи

  • Функция GetComputerName(Win-API)
  • Функция FlashWindow(Win-API)
  • Запуск программы в полноэкранном режиме(Win-API)
  • Пример с MessageBox для закрытия программы(Win-API)
  • Наша родная функция MessageBox(Win-API)

Аватары

Статистика блога

Метки

sirnet1988 13:40 on19.01.2010 Постоянная ссылка Ответить
Метки: Программирование ( 46 ), Win-API ( 16 )

Минимальная программа под Windows(Win-API)

блог-портфолио и прочие шалости Для начала создадим простейшую программу под Windows. Вообще в программировании есть традиция – начинать изучение с «Hello world». Аналогом такой пограммы будет являться наша – простое окошко.
Итак, создайте в любой IDE (Visual C++, C++ Builder) для C++ пустой проект типа Win32. В Visual C++, например, для этого нажимаем Ctrl+N, выбираем тип проекта Win32 Application, после чего нажимаем на Finish и OK (не меняя параметры по умолчанию), потом добавляем в проект *.cpp-файл. В файле введите следующий текст: #include

LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);intWINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,intnCmdShow) < HWND hwnd; MSG msg; WNDCLASS w; memset( w.style = CS_HREDRAW | CS_VREDRAW; w.lpfnWndProc = WndProc; w.hInstance = hInstance; w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); w.lpszClassName = «My Class»; RegisterClass( hwnd = CreateWindow(«My Class», «My title», WS_OVERLAPPEDWINDOW, 300, 200, 200, 180, NULL, NULL, hInstance, NULL); ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd);while(GetMessage( > LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam) switch(Message) caseWM_DESTROY: PostQuitMessage(0);break;default:returnDefWindowProc(hwnd, Message, wparam, lparam); >return0; >

Компилируем и запускаем программу (Ctrl+F5) в Visual C++. Если ошибок нет, то должно появиться окно. Просто окно.

Источник: melinuxru.wordpress.com

Модуль 1. Ваша первая программа Windows

В этом модуле мы напишем минимальную Windows классическую программу. Все, что это делает, — это создание и отображение пустого окна. Первая программа содержит около 50 строк кода, не считая пустых строк и комментариев. Это будет наша отправная точка; позже мы добавим графику, текст, ввод данных пользователем и другие функции.

Если вы ищете дополнительные сведения о создании традиционного классического приложения Windows в Visual Studio, см. пошаговое руководство. Создание традиционного классического приложения Windows (C++).

Screenshot of the example program, which shows it is a blank window with the title Learn to Program Windows.

Ниже приведен полный код программы:

#ifndef UNICODE #define UNICODE #endif #include LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) < // Register the window class. const wchar_t CLASS_NAME[] = L»Sample Window Class»; WNDCLASS wc = < >; wc.lpfnWndProc = WindowProc; wc.hInstance = hInstance; wc.lpszClassName = CLASS_NAME; RegisterClass( // Create the window. HWND hwnd = CreateWindowEx( 0, // Optional window styles.

Читайте также:
Как найти программу шпион на компьютере Windows 10

CLASS_NAME, // Window class L»Learn to Program Windows», // Window text WS_OVERLAPPEDWINDOW, // Window style // Size and position CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, // Parent window NULL, // Menu hInstance, // Instance handle NULL // Additional application data ); if (hwnd == NULL) < return 0; >ShowWindow(hwnd, nCmdShow); // Run the message loop. MSG msg = < >; while (GetMessage( 0) < TranslateMessage( DispatchMessage( >return 0; > LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) < switch (uMsg) < case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: < PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, // All painting occurs here, between BeginPaint and EndPaint. FillRect(hdc, EndPaint(hwnd, >return 0; > return DefWindowProc(hwnd, uMsg, wParam, lParam); >

Полный проект Visual Studio можно скачать из Windows Hello World Sample.

Это может быть полезно, чтобы дать краткое описание того, что делает этот код. В последующих разделах подробно рассматривается код.

  1. wWinMain— это точка входа программы. При запуске программы регистрируется некоторая информация о поведении окна приложения. Одним из наиболее важных элементов является адрес функции, именуемой WindowProc в этом примере. Эта функция определяет поведение окна — его внешний вид, взаимодействие с пользователем и т. д.
  2. Затем программа создает окно и получает дескриптор, который однозначно идентифицирует окно.
  3. Если окно создано успешно, программа переходит в цикл while. Программа остается в этом цикле, пока пользователь не закроет окно и не выйдет из приложения.

Обратите внимание, что программа явно не вызывает функцию WindowProc , даже если мы сказали, что это место, где определена большая часть логики приложения. Windows обменивается даннымис программой, передавая ему ряд сообщений. Код внутри цикла whileуправляет этим процессом. Каждый раз, когда программа вызывает функцию DispatchMessage, она косвенно вызывает Windows вызывать функцию WindowProc один раз для каждого сообщения.

В этом разделе

  • Создание окна
  • Сообщения окна
  • Написание процедуры window
  • Рисование окна
  • Закрытие окна
  • Управление состоянием приложения

Источник: learn.microsoft.com

Минимальная программа для windows

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Необходимо обновить браузер или попробовать использовать другой.

Минимальное Windows-приложение на ассемблере

Дата публикации 14 июн 2002

Минимальное Windows-приложение на ассемблере — Архив WASM.RU

  1. когда начинающий программист дочитывает до конца первую главу учебника и до него доходит, что большинство известных ему программ умеют нечто большее, чем тупо приветствовать мир. Пытливый ум новичка подсказывает ему, что если встречаются программы, умеющие больше этого, то, значит, где-то есть и программы, умеющие меньше
  2. когда начинающий программист робко, опасаясь быть проигнорированным, замодерированным или посланным, забрасывает вопрос в какую-нибудь конференцию. Последующие события, как правило, приводят его в шок, надолго отбивая охоту приступать к прочтению второй главы. Со всех концов бескрайней саванны мгновенно слетаются и сбегаются бесчисленные гуру, возникает потасовка, из облака пыли доносятся рык, ржание, визги и предсмертные хрипы, разлетаются перья и клоки шерсти. Великие считают и пересчитывают строчки в исходниках, потом буквочки в них же, а потом и байтики в екзешниках. Вопли стихают только после того, когда кто-нибудь предлагает подсчитывать биты, установленные в 1, и все вдруг понимают, почему двери в психушках открываются исключительно вовнутрь. Вывалив языки и тяжко дыша, братия расползается по своим кельям зализывать раны и готовиться к грядущим битвам. Посередине вытоптанной поляны, одинокий, жалкий и забытый, остывает трупик несчастного новичка
  3. когда новичок, отчаявшись познать истину самостоятельно или испить ее из ладоней великих, записывается на компьютерные курсы, и, с трудом досидев на первом занятии до сакраментального «У кого есть вопросы?», тянет руку и получает в ответ краткое изложение всей программы обучения. Затем, сверившись со списком группы и перезвонив в кассу, преподаватель также дает обещание, что к концу курса студент сам сможет элементарно ответить на этот простейший вопрос.

В C/C++, например, запуск и завершение приложения win32 поддерживаются скрытой от прикладного программиста функцией _WinMainCRTStartup, содержащейся в runtime-библиотеке. Именно ее вызывает операционная система при запуске приложения, а уж она, кое-чего поделав, вызывает ту самую WinMain, с которой начинается всякое приложение, базирующееся на win32. (Конечно, строго говоря, запуск приложения посредством вызова _WinMainCRTStartup — это свойство не языка, а операционной среды.) От программиста же требуется, чтобы WinMain была правильно оформлена (включая четыре входных параметра), и завершалась оператором return с кодом выхода типа int.

В языках программирования более высокого уровня для программиста все еще проще, хотя там уже вряд ли можно говорить о том, что приложение-де «непосредственно взаимодействует с операционной системой». Java, еще более высокий, чем C/С++, уже не использует фиксированное название стартовой функции, да и завершение программы в нем — это просто закрывающая фигурная скобка.

Однако, вернемся к ассемблеру. Вот обещанный текст минимального приложения для win32:
.model flat,stdcall
ExitProcess PROTO :DWORD
WinMain PROC PUBLIC hinst,prev_hinst,command_line,cmd_show
invoke ExitProcess,0
WinMain ENDP

Читайте также:
Программа установки Windows не может найти место для хранения временных файлов код ошибки 0х80070490

В результате компиляции и сборки этого приложения получается исполняемый файл размером 1536 байт. Из них собственно код занимает 10 байт. Все остальное — на совести создателей формата PE-файла. Приложение безропотно запускается и не задумываясь завершает свою работу, возвращая код выхода.

  • .386 — директива ассемблера, определяющая набор команд процессора, который может быть использован в программе. Для приложений win32 необходимо использовать эту директиву или выше, в зависимости от того, собираетесь ли вы использовать возможности, предоставляемые процессорами последующих поколений
  • .model flat,stdcall — сегментная директива ассемблера, определяющая сегментную модель приложения как плоскую, использующую соглашения о вызове процедур, принятые в win32. Именно такая сегментная модель должна всегда использоваться при написании приложений для win32 ExitProcess PROTO :DWORD — прототип функции API, выполняющей завершение приложения. (Поскольку сервис этой функции предоставляется dll-библиотекой kernel32.dll, то при сборке приложения хорошо бы не забыть подключить библиотеку импорта kernel32.lib)
  • .code — сегментная директива ассемблера, определяющая начало сегмента кода
  • WinMain PROC PUBLIC hinst,prev_hinst,command_line,cmd_show — начало тела стартовой процедуры. Следует обратить внимание на наличие директивы видимости (visibility) PUBLIC, которая позволит сборщику сделать процедуру доступной для операционной системы, дабы та смогла передать управление приложению. Параметры процедуры обсудим чуть ниже, правда, новость будет не очень приятной.
  • ;. — здесь должна быть всякая прочая мелочь, которую вы хотели бы заставить делать ваше приложение
  • invoke ExitProcess,0 — собственно вызов функции завершения приложения. Здесь код выхода 0, но он, естественно, может быть любым в пределах 32-разрядного целого. В полноценных приложениях нормой считается определение кода выхода в цикле обработки сообщений главного окна.
  • WinMain ENDP — всякое тело должно иметь конец. Это он и есть. Правда, в силу наличия предыдущей строки, он в данной программе не достижим, но это и не требуется: здесь мы просто исполняем необходимую формальность. Кстати, настоящим ассемблерщикам должно быть приятно, что, опустив ненужную в связи с этим команду ret, мы сэкономили аж 4 байта кода!
  • end — конец модуля.

Если залезть внутрь runtime-библиотеки C/C++, то мы увидим, что именно так завершает работу приложения уже упоминавшаяся функция _WinMainCRTStartup. Но поскольку подключать runtime-библиотеку C/C++ к ассемблерной программе как-то нелогично (хотя и вполне возможно), мы должны вызвать ExitProcess «вручную». Только эта функция корректно завершает работу приложения, в частности, оповещая использовавшиеся приложением библиотеки DLL о необходимости декрементировать их счетчики занятости и, при обнулении последних, выгрузиться из памяти.

  • hinst — не дескриптор текущего экземпляра приложения, а количество акций Microsoft у Билла Гейтса
  • prev_hinst — не 0, а прогнозируемое значение NASDAQ после выхода на мировой рынок российской ОС BrokenWindows
  • command_line — не указатель на командную строку, а традиционный народный российский указатель направления
  • cmd_show — не предлагаемый начальный вид окна, а то, что обещал показать мировому сообществу Никита Сергеевич Хрущов (и даже, помнится, начал раздеваться)
Читайте также:
Прекращена работа программы Windows media player rich preview handler

Источник: wasm.in

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru