// Include the Windows header file that’s needed for all Windows applications
#include <windows.h>
#include <string.h>
#include <string>
#include <tchar.h>
#include <stdlib.h>
#include <list>
#include <iostream>
HINSTANCE hInst; // global handle to hold the application instance
HWND wndHandle; // global variable to hold the window handle
// make class name into a global variable
TCHAR szClassName[ ] = _T(«WindowsApp»);
// forward declarations
bool initWindow( HINSTANCE hInstance );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
// This is winmain, the main entry point for Windows applications
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow )
{
// Initialize the window
if ( !initWindow( hInstance ) )
return false;
// main message loop:
MSG msg;
ZeroMemory( &msg, sizeof( msg ) );
while( msg.message!=WM_QUIT )
{
// Check the message queue
while (GetMessage(&msg, wndHandle, 0, 0) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
return (int) msg.wParam;
}
// bool initWindow( HINSTANCE hInstance )
//initWindow registers the window class for the application, creates the window
bool initWindow( HINSTANCE hInstance )
{
WNDCLASSEX wcex;
// Fill in the WNDCLASSEX structure. This describes how the window
// will look to the system
wcex.cbSize = sizeof(WNDCLASSEX); // the size of the structure
wcex.style = CS_HREDRAW | CS_VREDRAW; // the class style
wcex.lpfnWndProc = (WNDPROC)WndProc; // the window procedure callback
wcex.cbClsExtra = 0; // extra bytes to allocate for this class
wcex.cbWndExtra = 0; // extra bytes to allocate for this instance
wcex.hInstance = hInstance; // handle to the application instance
wcex.hIcon = 0; // icon to associate with the application
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);// the default cursor
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // the background color
wcex.lpszMenuName = NULL; // the resource name for the menu
wcex.lpszClassName = _T(«WindowsApp»); // the class name being created
wcex.hIconSm = 0; // the handle to the small icon
if (!RegisterClassEx(&wcex));
return 0;
// Create the window
wndHandle = CreateWindowEx(
0,
szClassName,
_T(«Windows App»),
WS_OVERLAPPEDWINDOW,
// the window class to use
// the title bar text
// the window style
CW_USEDEFAULT, // the starting x coordinate
CW_USEDEFAULT, // the starting y coordinate
640, // the pixel width of the window
480, // the pixel height of the window
NULL, // the parent window; NULL for desktop
NULL, // the menu for the application; NULL for
// none
hInstance, // the handle to the application instance
NULL); // no values passed to the window
// Make sure that the window handle that is created is valid
if (!wndHandle)
return false;
// Display the window on the screen
ShowWindow(wndHandle, SW_SHOW);
UpdateWindow(wndHandle);
return true;
}
Содержание
- Error c2731 winmain функция не может быть перегружена
- Answered by:
- Question
- Error c2731 winmain функция не может быть перегружена
- Ошибки компилятора с C2700 по C2799
- Введение в Win32 API
- Ошибка компилятора C2672
- Пример
Error c2731 winmain функция не может быть перегружена
This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.
Answered by:
Question
// Include the Windows header file that’s needed for all Windows applications
#include
#include
#include
#include
#include
#include
#include
HINSTANCE hInst; // global handle to hold the application instance
HWND wndHandle; // global variable to hold the window handle
// make class name into a global variable
TCHAR szClassName[ ] = _T(«WindowsApp»);
// forward declarations
bool initWindow( HINSTANCE hInstance );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
// This is winmain, the main entry point for Windows applications
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow )
<
// Initialize the window
if ( !initWindow( hInstance ) )
return false;
// main message loop:
MSG msg;
ZeroMemory( &msg, sizeof( msg ) );
while( msg.message!=WM_QUIT )
<
// Check the message queue
while (GetMessage(&msg, wndHandle, 0, 0) )
<
TranslateMessage( &msg );
DispatchMessage( &msg );
>
>
return (int) msg.wParam;
>
// bool initWindow( HINSTANCE hInstance )
//initWindow registers the window class for the application, creates the window
bool initWindow( HINSTANCE hInstance )
<
WNDCLASSEX wcex;
// Fill in the WNDCLASSEX structure. This describes how the window
// will look to the system
wcex.cbSize = sizeof(WNDCLASSEX); // the size of the structure
wcex.style = CS_HREDRAW | CS_VREDRAW; // the class style
wcex.lpfnWndProc = (WNDPROC)WndProc; // the window procedure callback
wcex.cbClsExtra = 0; // extra bytes to allocate for this class
wcex.cbWndExtra = 0; // extra bytes to allocate for this instance
wcex.hInstance = hInstance; // handle to the application instance
wcex.hIcon = 0; // icon to associate with the application
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);// the default cursor
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // the background color
wcex.lpszMenuName = NULL; // the resource name for the menu
wcex.lpszClassName = _T(«WindowsApp»); // the class name being created
wcex.hIconSm = 0; // the handle to the small icon
if (!RegisterClassEx(&wcex));
return 0;
// Create the window
wndHandle = CreateWindowEx(
0,
szClassName,
_T(«Windows App»),
WS_OVERLAPPEDWINDOW,
// the window class to use
// the title bar text
// the window style
CW_USEDEFAULT, // the starting x coordinate
CW_USEDEFAULT, // the starting y coordinate
640, // the pixel width of the window
480, // the pixel height of the window
NULL, // the parent window; NULL for desktop
NULL, // the menu for the application; NULL for
// none
hInstance, // the handle to the application instance
NULL); // no values passed to the window
// Make sure that the window handle that is created is valid
if (!wndHandle)
return false;
// Display the window on the screen
ShowWindow(wndHandle, SW_SHOW);
UpdateWindow(wndHandle);
return true;
>
Источник
Error c2731 winmain функция не может быть перегружена
В настройках проекта укажи: (пкм на названии проекта слева и там Properties)
Charaster Set : Use multi-byte charaster set
Ошибки не будет.
в MSDN написано что MessageBox принимает 3 аргумента.
может быть то что в message Box 4 аргумента
в MessageBox’е 4 аргумента. Однако четверый аргумент можно не заполнять, по умолчанию он равен MB_OK (вроде, точно не помню). Это никак не связано с функцией WinMain. Функция WinMain — это entrypoint. (заглядывая вперед). С ней начинается выполнение программы.
P.S. «привет» по английски пишется hello а не hellow
#include
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
<
MessageBox( NULL, TEXT(«Hello!»), TEXT(«Hellow From message Box»),MB_OK);
return 0;
>
Так попробуй. И посмотри в чем различие реализации для Анси и Юникода.
MSVC++ 6.0
обе версии компилятся и работают.
тип проекта Win32 Application
кстати у бокса второй параметр текст сообщения а третий его заголовок.
Источник
Ошибки компилятора с C2700 по C2799
В статьях в этом разделе документации объясняется подмножество сообщений об ошибках, создаваемых компилятором.
Компиляторы и средства сборки Visual Studio могут сообщать о различных типах ошибок и предупреждений. После того как обнаружена ошибка или предупреждение, средства сборки могут делать предположения о намерении кода и пытаться продолжить, чтобы в то же время сообщалось о дополнительных проблемах. Если средства делают неверное предположение, последующие ошибки или предупреждения не могут применяться к проекту. При устранении проблем в проекте всегда начинайте с первой зарегистрированной ошибки (или предупреждения) и выполняйте повторную сборку как можно чаще. Одно исправление может привести к устранению многих последующих ошибок.
Чтобы получить справку о конкретном диагностическом сообщении в Visual Studio, выберите его в окне вывода и нажмите клавишу F1 . Visual Studio открывает страницу документации для этой ошибки, если она существует. Вы также можете использовать средство поиска в верхней части страницы, чтобы найти статьи о конкретных ошибках или предупреждениях. Или просмотрите список ошибок и предупреждений по инструменту и введите оглавление на этой странице.
Не все ошибки или предупреждения Visual Studio описаны. Во многих случаях диагностическое сообщение предоставляет все доступные сведения. Если вы приземлились на этой странице при использовании F1 , и вы думаете, что сообщение об ошибке или предупреждении нуждается в дополнительном объяснении, сообщите нам об этом. Кнопки обратной связи на этой странице можно использовать для устранения проблемы с документацией на сайте GitHub. Если вы считаете ошибку или предупреждение неправильным или обнаружили еще одну проблему с набором инструментов, сообщите о проблеме продукта на сайте Сообщество разработчиков. Вы также можете отправлять отзывы и вводить ошибки в интегрированной среде разработки. В Visual Studio перейдите в строку меню и выберите «Отправить > отзыв о > проблеме» или отправьте предложение с помощью отправки > отзывов > справки.
Вы можете найти дополнительную помощь по ошибкам и предупреждениям на форумах Microsoft Learn Q&A . Или найдите номер ошибки или предупреждения на сайте Сообщество разработчиков Visual Studio C++. Вы также можете выполнить поиск решений в Stack Overflow .
Ссылки на дополнительные справочные материалы и ресурсы сообщества см. в справке и сообществе Visual C++.
Источник
Введение в Win32 API
Win32 API (далее WinAPI) – это набор функций (API – Application Programming Interface), работающих под управлением ОС Windows. Они содержатся в библиотеке windows.h .
С помощью WinAPI можно создавать различные оконные процедуры, диалоговые окна, программы и даже игры. Эта, скажем так, библиотека является базовой в освоении программирования Windows Forms, MFC, потому что эти интерфейсы являются надстройками этой библиотеки. Освоив её, Вы без труда будете создавать формы, и понимать, как это происходит.
Не будем внедряться в теорию. Начнём с того, как создать этот проект в MVS, а в конце статьи будет разобран простой пример.
Итак. Сначала открываем Visual Studio, затем, нажимаем на вкладку «Файл», далее «Создать проект»:
Затем, в раскрывающемся списке Visual C++ выбираем пункт Win32, там и будет «Проект Win32». Щелкаем по нему: Вводим название проекта, указываем путь и нажимаем «ОК». Далее будет написано: «Добро пожаловать в мастер приложения Win32». Нажимаем далее. По-умолчанию у надписи «Пустой проект» галочка отсутствует. Нам нужно её поставить и убедиться, что у нас «Тип Приложения» — Приложение Windows. Если всё верно, нажимаем – «Готово».
У нас должен быть пустой проект такого вида:
Ну а теперь начнём писать простую программу, которая традиционно будет выводить на экран надпись: «Привет, Мир. ».
Естественно, к проекту нужно добавить файл типа «имя».cpp. Кликаем по «Файлы исходного кода» правой кнопкой мыши, в раскрывающемся списке выбираем вкладку – «Добавить», далее «Создать элемент…». В результате у нас должно появиться такое окно:
Выбираем «Файл С++», вводим имя, нажимаем «Добавить». Затем открываем этот файл и вставляем в него такой код (подробности далее):
Результат должен быть таким:
Теперь остановимся поподробнее на коде программы.
В первой строке мы подключаем заголовочный файл windows.h . В нём содержатся все необходимые «апишные» функции. Здесь всё понятно.
В 4-7 строках у нас описание функции int WINAPI WinMain() .
Квалификатор WINAPI, нужен для функции WinMain всегда. Просто запомните это. WinMain – название функции. Она имеет четыре параметра. Первый из них – HINSTANCE hInstance (строка 4). hInstance является дескриптором экземпляра окна (это некий код оконной процедуры, идентификатор, по которой ОС будет отличать её от остальных окон). Через него можно обращаться к окну в процессе работы в других функциях (об этом позже), что-либо менять в параметрах окна. HINSTANCE является одним из многочисленных типов данных определенных в WinAPI, таким же как int, например. А запись HINSTANCE hInstance говорит нам о том, что мы создаём новую переменную типа HINSTANCE с названием hInstance.
О типах данным мы поговорим позже, поэтому переходим к следующему параметру: HINSTANCE hPrevInstance (строка 5). Как написано в комментариях, в Win32 он не используется, так как он создан для 3.x разрядной системы, из предыдущего понятно, что это дескриптор экземпляра окна. Далее у нас переменная типа LPSTR (строка 6) с именем lpCmdLine . Она используется в том случае, если мы запускаем окно через командную строку с прописью параметров. Очень экзотический способ, поэтому мы не будем на нём задерживаться.
И последний параметр: целочисленный, определяет способ показа окна. Нужен для функции ShowWindow , которая будет описана позже. Например, с помощью него мы можем развернуть окно на весь экран, сделать его определённой высоты, прозрачным или поверх остальных.
Переходим к функции MessageBox() (строка 10). Она имеет четыре параметра и нужна для вывода сообщений о ошибках, например. В данном случае мы использовали её для вывода сообщения. В общем виде описание функции выглядит следующим образом:
В нашем случае, первому параметру присвоен ноль. Всё потому, что у нас нет родительских окон (оно не запущено какой-нибудь программой).
Далее у нас идут две переменные типа LPCTSTR : lpText и lpCaption . Первая сообщает информацию, которая будет выведена в окне в текстовом виде. Вторая сообщает, что будет написано в тексте заголовка к окну. Это аналог char *str , но всё же нет. Для того, чтобы текст выводился корректно, нужно перед строкой поставить букву L (UNICODE строка).
Ну и последний тип данных – UINT – 32-х битное целое без знака. То есть аналог unsigned int . Этому параметру можно передавать некоторые значения (о них тоже позже), за счёт чего можно менять вид кнопки. В нашем случае – это MB_OK — означает, что окно создаёт кнопку с надписью «ОК» и соответствующим действием при её нажатии (закрытием приложения).
В строке 11 мы возвращаем значение функции, так как она имеет не тип void .
Таким образом, общее представление о WinAPI теперь есть. Продолжение в следующих разделах.
Источник
Ошибка компилятора C2672
«function«: соответствующая перегруженная функция не найдена
Компилятору не удалось найти перегруженную функцию, соответствующую указанной функции. Не найдена функция, которая принимает соответствующие параметры, или соответствующая функция не имеет необходимых специальных возможностей в контексте.
При использовании определенных стандартных контейнеров или алгоритмов библиотеки типы должны предоставлять доступные члены или дружественные функции, удовлетворяющие требованиям контейнера или алгоритма. Например, типы итератора должны быть производными от std::iterator<> . Для операций сравнения или использования других операторов в типах элементов контейнера может потребоваться, чтобы тип считался как левый, так и как правый операнд. Использование типа в качестве правого операнда может потребовать реализации оператора в качестве функции, не являющейся членом типа.
Пример
Версии компилятора до Visual Studio 2017 не выполняли проверку доступа к полным именам в некоторых контекстах шаблонов. Это может помешать ожидаемой работе SFINAE там, где подстановка должна завершиться ошибкой из-за отсутствия доступа к имени. Такая ситуация может приводить к сбою или неожиданному поведению во время выполнения из-за того, что компилятор неправильно вызывает неверную перегрузку оператора. В Visual Studio 2017 выводится ошибка компилятора.
Этот пример компилируется в Visual Studio 2015, но вызывает ошибку в Visual Studio 2017. Чтобы устранить эту проблему, сделайте элемент параметра шаблона доступным там, где он вычисляется.
Источник
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
#include "Main.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, char* lpCmdLine, LPCTSTR nCmdShow, LPSTR WindowName, int WindowWidth, int WindowHeight) { g_hInstance = GetModuleHandle(NULL); WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); //Размер структуры wc.style = CS_HREDRAW | CS_VREDRAW; //Стили класса окна wc.lpfnWndProc = WndProc; //Функция обработки сообщений wc.cbClsExtra = 0; //Количество выделяемой памяти при создании приложения wc.cbWndExtra = 0; //Количество выделяемой памяти при создании приложения wc.hInstance = g_hInstance; //Дескриптор приложения wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //Загружаем стандартную иконку wc.hCursor = LoadCursor(0, IDC_ARROW); //Загружаем стандартный курсор wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);//Окно будет закрашено в белый цвет wc.lpszMenuName = 0; //Не используем меню wc.lpszClassName = "Lost Days"; //Названия класса wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //Загружаем стандартную иконку if (!RegisterClassEx(&wc)) //Регистрируем класс в Windows { Shutdown(); //Освобождаем память MessageBox(NULL, "Can`t register window class", "Error", MB_OK | MB_ICONERROR); //Выводим сообщение return 0; //Завершаем работу приложения } g_hWnd = CreateWindowEx( //Создаем окно WS_EX_APPWINDOW | WS_EX_WINDOWEDGE, //Расширенный стиль окна "Lost Days", //Названия класса окна WindowName, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,//Стиль окна 0, //Позиция окна по оси Х 0, //Позиция окна по оси У WindowWidth, //Ширина окна WindowHeight, //Высота окна NULL, //Это наше главное окно NULL, //Нету меню g_hInstance, //Дескриптор приложения NULL); //Дополнительный настроек не используем if (g_hWnd == NULL) //Если не создали окно { Shutdown(); MessageBox(NULL, "Can`t create window", "Error", MB_OK | MB_ICONERROR);//Выводим сообщение return 0; //Завершаем работу приложения } if (!InitDirect3D(D3DFMT_R5G6B5, D3DFMT_D16, WindowWidth, WindowHeight)) //Если не смогли инициализировать Direct3D { Shutdown(); MessageBox(NULL, "Can`t create direct3d", "Error", MB_OK | MB_ICONERROR);//Выводим сообщение return 0; //Завершаем работу приложения } ShowWindow(g_hWnd, SW_SHOW); //Отображаем окно UpdateWindow(g_hWnd); //Обновляем окно SetFocus(g_hWnd); //Устанавливаем фокус на наше окно SetForegroundWindow(g_hWnd); //Устанавливаем приоритет окна выше среднего MSG msg; ZeroMemory(&msg, sizeof(msg)); while (g_bApplicationState) //Начинаем бесконечный цикл обработки сообщений { if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))//Получаем сообщения { TranslateMessage(&msg); //Обрабатываем сообщения DispatchMessage(&msg); //Обрабатываем сообщения } else DrawFrame(); //Если сообщений нету рисуем кадры } Shutdown(); //Освобождаем память return 0; //Завершаем работу приложения } |
Я обновил старый проект с VC6 до VS2008, и теперь я получаю эту ошибку компиляции:
error C2731: 'wWinMain' : function cannot be overloaded
В этих строках кода:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
Тот же проект прекрасно компилируется под VC6.
4
Решение
Спасибо всем, я наконец нашел настоящего виновника, это опечатка, я использую LPSTR lpCmdLine
вместо LPTSTR lpCmdLine
, Настоящая загадка заключается в том, почему он вообще скомпилирован под VC6 — он использовал wWinMain
, но каким-то образом это было нормально для lpCmdLine, чтобы быть char *
вместо WCHAR *
,
Теперь я изменил это на:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
И это работает под VS2008 тоже.
Редактировать: Я успешно скомпилировал и даже запустил программу с этим определением функции под VC6:
int APIENTRY wWinMain(int *hInstance, float hPrevInstance, int *lpCmdLine, float nCmdShow)
{
MessageBox(0,L"Running.",0,0);
return 0;
}
Интересно, что замена float nCmdShow
в double nCmdShow
я даю ошибку компоновщика, я полагаю, потому что float 32-битный, а double — нет.
9
Другие решения
У меня была такая же ошибка с Консольное приложение Win32. Исправление было:
- открыто проект > Свойства …,
- расширять Свойства конфигурации > Linker > система
- Задавать SubSystem в Не установлен
- Нажмите Хорошо
0
I know it’s been a while since I’ve done any C/C++ or Windows programming but I’m pretty damn sure that everything here is fine and I can’t understand why MS:VSE12 is whining at me.
I did even create a new project and try pasting the code in their again because VS sometimes has a tantrum with odd projects and decides to never work with then, but a new project doesn’t work.
|
|
EDIT: The first project had VS set up to not use UNICODE, the second project was left as defaults (which does auto define UNICODE), but the error is present on both and the character set doesn’t really matter… The only difference being that without UNICODE defined the compiler error says
EDIT2: I’m not trying to find anything wrong with the code because I don’t thing their is (if you spot something tell me though as it could be that), I’ve seen many people with the same problem and all the answers have been along the lines of
Even though VS automatically defines UNICODE so this doesn’t matter other than bad practice for mixing the types as it can potentially cause issues…
Does anyone know why VS would complain about the main functions being overloaded when they’re clearly not?