C как использовать winapp вместо main
Перейти к содержимому

C как использовать winapp вместо main

  • автор:

C как использовать winapp вместо main

Библиотека MFC является объектно-ориентированной и поэтому нам нужен наш класс приложения. Добавим его в проект HMFC.

И дадим ему имя CWinApp.

Класс у нас есть. Теперь идея такая. Любая программа должны обрабатывать сообщения. То есть после WinMain должен начинаться цикл обработки сообщений. Вот и пусть он будет у нас в классе в смысле цикл обработки. Для этого в классе создадим функцию Run которая и будет запускать этот цикл обработки сообщений.

Из WinMain мы должны эту функцию запустить. Но ведь мы не знаем кокой будет класс так как потом люди могут этот класс наследовать и так далее. Поэтому нам нужно завести глобальную ссылку на этот класс что бы используя ее могли добираться до этого класса. Вот мы ее и заведем.

Но помимо этого мы опишем и глобальную функцию доступа к этой переменной.

Изменим конструкт CWinApp то есть при создании объект CWinApp у вас автоматически инициализируется afxCurrentWinApp

Теперь нам нужно подключить заголовочный файл самого Windows.

Собирайте проект и переходите в TestMyLib, Подключим заголовочный файл и проведем испытания.

Replacing WinMain() with main() function in Win32 programs

I searched a little bit on StackOverflow and Google but couldn’t get the idea. I want to start my application with this type of user programming:

But this isn’t possible because I should pass the hInstance and hPrevInstance and other parameters to a WinMain function. Actually there is a Window class which I designed to make the window creation a little bit easier. I saw this implementation on SFML but I don’t know how it did come to this.

Right now I’m using the usual way:

MahanGM's user avatar

4 Answers 4

You can use standard main in a "windows" app (that is, a GUI subsystem Windows application) even with the Microsoft tools, if you add the following to the Microsoft linker options:

Note that this is not necessary for the GNU toolchain.

Still for the Microsoft tools you can alternatively add this to your main file:

GetModuleHandle(NULL) will give you hInstance . hPrevInstance is always NULL .

James McNellis's user avatar

First, GetModuleHandle(0) provides the executable’s module handle, which is the same as the hInstance argument of WinMain .

With the GNU toolchaing (g++ compiler), the standard-conforming code is OK.

The Microsoft toolchain, however, only accepts the standard-conforming code by default for a console subsystem executable. To create a GUI subsystem executable with this non-conforming toolchain, using a standard main , you have to specify a Microsoft runtime library entry point that calls the standard main , namely mainCRTStartup . For a command line invocation that means…

As a practical matter, for working in the command line you can simply specify the entry point in the LINK environment variable:

Creating a similar standard-conforming setup for Visual Studio is perhaps not desirable, since some Visual Studio project types (mainly MFC) requires use of Microsoft’s non-standard WinMain or wWinMain .

C как использовать winapp вместо main

C как использовать winapp вместо main

Простой способ перейти от main к WinMain, а от командной строки грамотно получить список аргументов

#ifdef WIN32
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPreInst, LPSTR lpCmdLine, int nCmdShow )
#else
int main( int argc, char *argv[] )
#endif

LPWSTR* lpArgv = CommandLineToArgvW( GetCommandLineW(), &argc );
. . .
LocalFree( lpArgv );

int argc;
char** argv;
LPWSTR* lpArgv = CommandLineToArgvW( GetCommandLineW(), &argc );
argv = (char**)malloc( argc*sizeof(char*) );
int size, i = 0;
for( ; i < argc; ++i )
size = wcslen( lpArgv[i] ) + 1;
argv[i] = malloc( size );
wcstombs( argv[i], lpArgv[i], size );
>
LocalFree( lpArgv );
>

int i = 0;
for( ; i < argc; ++i )
free( argv[i] );
free( argv );
>

#if defined(WIN32) && defined(DEBUG)
#define MAIN_NEED_CLEAR_ARGV
#include <shellapi.h>
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPreInst, LPSTR lpCmdLine, int nCmdShow )
int argc;
char** argv;
LPWSTR* lpArgv = CommandLineToArgvW( GetCommandLineW(), &argc );
argv = (char**)malloc( argc*sizeof(char*) );
int size, i = 0;
for( ; i < argc; ++i )
size = wcslen( lpArgv[i] ) + 1;
argv[i] = malloc( size );
wcstombs( argv[i], lpArgv[i], size );
>
LocalFree( lpArgv );
>
#else
int main( int argc, char *argv[] )
#endif

#ifdef MAIN_NEED_CLEAR_ARGV
int i = 0;
for( ; i < argc; ++i )
free( argv[i] );
free( argv );
>
#endif

Точка входа отличная от main/WinMain

Ошибка: In function main: 18 undefined reference to WinMain
Создайте класс, содержащий 2 закрытые переменные (катеты прямоугольного треугольника) и открытые.

Настройка размера окна при открытии программы (main(), не WinMain()
Доброго времени суток, форумчане! Во первых, хочу вас всех поблагодарить за помощь, благодаря.

Не могу запустить WPF проект. Не найдена точка входа Main. Ничего не понимаю.
Создал проект WPF. Удалил MainWindow.xaml, MainWindow.xaml.cs, App.xaml, App.xaml.cs. Потом такие.

Простое окно WinAPI Объектно-ориентированное

Я пытаюсь запустить простейшее окно объектно-ориентированным способом:

Я получаю сообщение об ошибке:

«Необработанное исключение в 0x013F1ADA в _WinApi.exe: 0xC0000005: расположение чтения нарушения доступа 0x00000008».

А желтая стрелка указывает на определение обработчика m_hwnd.

Решение

Как писал Алан Стоукс, вы должны инициализировать указатель:

Другое дело, в функции:

вы создаете новую временную переменную:

и выделение памяти для него, а не вашей переменной-члена (m_hInstance). Пытаться:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *