keng

Небольшая статья про трейнеры и WinAPI

8 сообщений в этой теме

Прикладываю [ссылку на статью], где самым подробным образом разбирается "hello, world!" на Ассемблере, немного рассказывается про функции и их аргументы, а так же (совсем немного) описывается алгоритм работы большинства трейнеров.

Надеюсь, кому-нибудь пригодится. laugh.gif

[Вторая часть]. laugh.gif

[Третья часть], на этот раз - видеоурок. Пробежался по используемым WinAPI-функциям, ещё немного разобрал код в целом. Исходник и готовый пример приложены в архиве.

Дальше - больше. wink.gif

Спасибо, вроде бы - то, что надо. Попробую как можно в более легкоусваиваемой форме представить.

Так, простенький каркас трейнера мы написали, теперь будем его периодически улучшать. Вот небольшая заметка о том, как избавить окно от заголовка и научить его перетаскиваться за любую его часть: [тык]. laugh.gif

Да, я внезапно осознал, что этой теме было бы комфортнее вот в [этом] разделе. Модераторы, спасайте! :)

2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все твои статьи по асму очень хороши. Поставил по плюс один на каждый пост.

Боюсь, что только люди, которые знают 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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Окей, учту. Писал довольно-таки второпях, так что код пока не приложен. В видео всегда сначала запускаю готовое приложение, а потом уже построчно комментирую, разбавляя объяснениями попроще. Не знаю пока, стоит ли лезть в си - всё ещё есть возможность запутаться. Исполняемые файлы можно взять из папки с ассемблером, а всё, что напишем сами - буду прикладывать к статьям, само собой. :)

Хорошо ещё, что я не полез в дебри защищённого режима, Win16\Win32, моделей памяти, сегментов PE и так далее. Всё будет, но потихоньку.

PS: Спасибо за оценку. Надеюсь, что объяснения принесут пользу - я сам довольно долго втыкал в сухую англоязычную документацию.

PPS: Если есть что-нибудь толковое о winapi в целом (мне что-то на ум не приходит) - можно в лс ссылку?

Т.е. я в самом начале объяснил (очень кратно), что все процессы в системе общаются и взаимодействуют при помощи этих самых функций. Если это можно объяснить ещё проще - я только рад буду, честно. Иногда трудно объяснить то, что тебе кажется элементарным и с чем каждый день работаешь. laugh.gif

PS: Обновил статью, приложил исходник + скомпилированный проект, ну и дописал объяснения про недостающие места.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ты вроде просил ссылку по API. Вот хороший мануал (перевод SDK). Быстро сможешь прочитать как построить приложение на API. Это прочный фундамент полезно знать каждому перед тем как что-то писать на WinAPI на каком-то языке программирования.

И эта информация гораздо лучше воспринимается если знаешь язык С++ (работу с функцими, передачу аргументов, компиляция проекта). Синтаксис не такой насыщенный как у ассемблера и более компактный. А компактность это залог того, что ты увидишь всю программу лучше чем по мелочам на ассемблере. Ну я не говорю, что лучше увидит программист, я говорю о пользователей который немного знает о программирование на /Дельфи(Object Pascal/Pascal)/C#/C/C++

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо, вроде бы - то, что надо. Попробую как можно в более легкоусваиваемой форме представить.

Да, я внезапно осознал, что этой теме было бы комфортнее вот в [этом] разделе. Модераторы, спасайте! :)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Таки нет же, ты же в теме рассказываешь, ищешь и информируешь о том, как можно сделать тренер.

А тот раздел направлен не на исследование проблем, а просто на готовую информацию по 1 вопросу.

Я лично не вижу смысла для переноса темы, посмотрим что скажет Андрей или Xipho

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Таки нет же, ты же в теме рассказываешь, ищешь и информируешь о том, как можно сделать тренер.

А тот раздел направлен не на исследование проблем, а просто на готовую информацию по 1 вопросу.

Я лично не вижу смысла для переноса темы, посмотрим что скажет Андрей или Xipho

Так это, я вроде так и написал - не "Вопросы по созданию трейнеров", а "Информация по созданию трейнеров". Misunderstanding получилось. icon_e_biggrin.gif

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я так понял тема уже перенесена откуда-то кем-то. Да будет здесь ей место. Посты почистил и объединил. Рейтинг keng-а не изменился.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас