keng Опубликовано 20 декабря, 2011 Поделиться Опубликовано 20 декабря, 2011 Прикладываю [ссылку на статью], где самым подробным образом разбирается "hello, world!" на Ассемблере, немного рассказывается про функции и их аргументы, а так же (совсем немного) описывается алгоритм работы большинства трейнеров.Надеюсь, кому-нибудь пригодится. [Вторая часть]. [Третья часть], на этот раз - видеоурок. Пробежался по используемым WinAPI-функциям, ещё немного разобрал код в целом. Исходник и готовый пример приложены в архиве.Дальше - больше. Спасибо, вроде бы - то, что надо. Попробую как можно в более легкоусваиваемой форме представить.Так, простенький каркас трейнера мы написали, теперь будем его периодически улучшать. Вот небольшая заметка о том, как избавить окно от заголовка и научить его перетаскиваться за любую его часть: [тык]. Да, я внезапно осознал, что этой теме было бы комфортнее вот в [этом] разделе. Модераторы, спасайте! 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 21 декабря, 2011 Поделиться Опубликовано 21 декабря, 2011 Все твои статьи по асму очень хороши. Поставил по плюс один на каждый пост.Боюсь, что только люди, которые знают WinAPI хорошо понимают о чём идёт речь. Те кто первый раз имеет дело с WinAPI боюсь должны приложить много упорства. Чтобы материал возможно лучше воспринимался мои пожелания строить статьи следующим образом.1. Показать результат. Показать готовый exe-шник и скриншот. Покаазать весь исходник без комментариев, который пользователь должен скомпилить и сам убедиться что его код работает. И лучше это скомпилировать сейчас и почувствовать сейчас в начале статьи, а не в конце статьи. Т.е. пользователь вынужден запоминать правила построения приложения, но ещё не увидел конечный результат, а только смутно представил.2. А вот теперь по кускам разбираем участки кода, т.е. то что ты обычно пишешь.3. Ещё очень было бы полезно поучить читателя работать с документацией WinAPI по состовлению приложения "Простой диалог" на C++ и сравнить это дело с fasm-ов или другим ассемблером:Можно найти этот исходный код по запросу "MSDN Создание приложения Win32 (C++)"// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c#include <windows.h>#include <stdlib.h>#include <string.h>#include <tchar.h>// Global variables// The main window class name.static TCHAR szWindowClass[] = _T("win32app");// The string that appears in the application's title bar.static TCHAR szTitle[] = _T("Win32 Guided Tour Application");HINSTANCE hInst;// Forward declarations of functions included in this code module:LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); if (!RegisterClassEx(&wcex)) { MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Win32 Guided Tour"), NULL); return 1; } hInst = hInstance; // Store instance handle in our global variable // The parameters to CreateWindow explained: // szWindowClass: the name of the application // szTitle: the text that appears in the title bar // WS_OVERLAPPEDWINDOW: the type of window to create // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y) // 500, 100: initial size (width, length) // NULL: the parent of this window // NULL: this application does not have a menu bar // hInstance: the first parameter from WinMain // NULL: not used in this application HWND hWnd = CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL ); if (!hWnd) { MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("Win32 Guided Tour"), NULL); return 1; } // The parameters to ShowWindow explained: // hWnd: the value returned from CreateWindow // nCmdShow: the fourth parameter from WinMain ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // Main message loop: MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam;}//// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)//// PURPOSE: Processes messages for the main window.//// WM_PAINT - Paint the main window// WM_DESTROY - post a quit message and return////LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdc; TCHAR greeting[] = _T("Hello, World!"); switch (message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // Here your application is laid out. // For this introduction, we just print out "Hello, World!" // in the top left corner. TextOut(hdc, 5, 5, greeting, _tcslen(greeting)); // End application-specific layout section. EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); break; } return 0;}// GT_HelloWorldWin32.cpp Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 21 декабря, 2011 Автор Поделиться Опубликовано 21 декабря, 2011 Окей, учту. Писал довольно-таки второпях, так что код пока не приложен. В видео всегда сначала запускаю готовое приложение, а потом уже построчно комментирую, разбавляя объяснениями попроще. Не знаю пока, стоит ли лезть в си - всё ещё есть возможность запутаться. Исполняемые файлы можно взять из папки с ассемблером, а всё, что напишем сами - буду прикладывать к статьям, само собой. Хорошо ещё, что я не полез в дебри защищённого режима, Win16\Win32, моделей памяти, сегментов PE и так далее. Всё будет, но потихоньку.PS: Спасибо за оценку. Надеюсь, что объяснения принесут пользу - я сам довольно долго втыкал в сухую англоязычную документацию.PPS: Если есть что-нибудь толковое о winapi в целом (мне что-то на ум не приходит) - можно в лс ссылку?Т.е. я в самом начале объяснил (очень кратно), что все процессы в системе общаются и взаимодействуют при помощи этих самых функций. Если это можно объяснить ещё проще - я только рад буду, честно. Иногда трудно объяснить то, что тебе кажется элементарным и с чем каждый день работаешь. PS: Обновил статью, приложил исходник + скомпилированный проект, ну и дописал объяснения про недостающие места. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 21 декабря, 2011 Поделиться Опубликовано 21 декабря, 2011 Ты вроде просил ссылку по API. Вот хороший мануал (перевод SDK). Быстро сможешь прочитать как построить приложение на API. Это прочный фундамент полезно знать каждому перед тем как что-то писать на WinAPI на каком-то языке программирования.И эта информация гораздо лучше воспринимается если знаешь язык С++ (работу с функцими, передачу аргументов, компиляция проекта). Синтаксис не такой насыщенный как у ассемблера и более компактный. А компактность это залог того, что ты увидишь всю программу лучше чем по мелочам на ассемблере. Ну я не говорю, что лучше увидит программист, я говорю о пользователей который немного знает о программирование на /Дельфи(Object Pascal/Pascal)/C#/C/C++ Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 21 декабря, 2011 Автор Поделиться Опубликовано 21 декабря, 2011 Спасибо, вроде бы - то, что надо. Попробую как можно в более легкоусваиваемой форме представить.Да, я внезапно осознал, что этой теме было бы комфортнее вот в [этом] разделе. Модераторы, спасайте! Ссылка на комментарий Поделиться на другие сайты Поделиться
Kvazimado Опубликовано 22 декабря, 2011 Поделиться Опубликовано 22 декабря, 2011 Таки нет же, ты же в теме рассказываешь, ищешь и информируешь о том, как можно сделать тренер.А тот раздел направлен не на исследование проблем, а просто на готовую информацию по 1 вопросу. Я лично не вижу смысла для переноса темы, посмотрим что скажет Андрей или Xipho Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 22 декабря, 2011 Автор Поделиться Опубликовано 22 декабря, 2011 Таки нет же, ты же в теме рассказываешь, ищешь и информируешь о том, как можно сделать тренер.А тот раздел направлен не на исследование проблем, а просто на готовую информацию по 1 вопросу. Я лично не вижу смысла для переноса темы, посмотрим что скажет Андрей или XiphoТак это, я вроде так и написал - не "Вопросы по созданию трейнеров", а "Информация по созданию трейнеров". Misunderstanding получилось. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 22 декабря, 2011 Поделиться Опубликовано 22 декабря, 2011 Я так понял тема уже перенесена откуда-то кем-то. Да будет здесь ей место. Посты почистил и объединил. Рейтинг keng-а не изменился. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения