Страница 1 из 2

самое начало...

Добавлено: 15 окт 2009, 19:33
Dimarik (C)
добрый вечер. только начинаю работать с winApi. создал проект:
файл/Win 32 Priject, empty project (галочку поставил)
потом в Sourse files добавил файл *.срр вот и в нём вручную начал код писать.

Код: Выделить всё

#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox( NULL, "Hellow!", "Hellow From message Box",MB_OK);
return 0;
}
написал свой первый проект в Win32Api. толком ничё не понял.
в MSDN написано что MessageBox принимает 3 аргумента.
может быть то что в message Box 4 аргумента как-то связано с тем, что int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hRrevInstance,
и самая главная проблема с комплятором. не очень понятно где ошибка. он вообще пишет:

Код: Выделить всё

1>------ Build started: Project: Hello, Configuration: Debug Win32 ------
1>Compiling...
1>Hello.cpp
1>c:\documents and settings\дима\мои документы\visual studio 2008\projects\project1\hello\hello.cpp(4) : error C2731: 'WinMain' : function cannot be overloaded
1>        c:\documents and settings\дима\мои документы\visual studio 2008\projects\project1\hello\hello.cpp(2) : see declaration of 'WinMain'
1>Build log was saved at "file://c:\Documents and Settings\Дима\Мои документы\Visual Studio 2008\Projects\Project1\Hello\Debug\BuildLog.htm"
1>Hello - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
P.S. у меня MS Visual 2008

Re: самое начало...

Добавлено: 15 окт 2009, 22:45
Newbie
твой код сбилдился без ошибок...

1>------ Build started: Project: gg_temp_wapi, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>Linking...
1>LINK : ...temp_wapi.exe not found or not built by the last incremental link; performing full link
1>Embedding manifest...
1>Build log was saved at "file:...BuildLog.htm"
1>gg_temp_wapi - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

ЗЫ создавал пустой проект и вставил в него указанный код

Re: самое начало...

Добавлено: 20 окт 2009, 11:24
mc-black
Нет, в MSDN не могли написать такую глупость - у MessageBox ровно 4 параметра, каждый по 4 байта, всего 16 байт помещается в стэк перед вызовом.

Re: самое начало...

Добавлено: 20 окт 2009, 11:45
atavin-ta
&quot писал(а):Нет, в MSDN не могли написать такую глупость - у MessageBox ровно 4 параметра, каждый по 4 байта, всего 16 байт помещается в стэк перед вызовом.
Глупость написать не могли, но могли именно так и сделать (объявить функцию именно с тремя параметрами).

Re: самое начало...

Добавлено: 20 окт 2009, 12:19
mc-black
Уважаемый, atavin-ta, может не надо фантазировать? Декаларация (объявление) не может быть неверным, для этой функции, т.к. автор не сам заголовочный файлы (windows.h) составлял. Тут все верно, неверно то, на что ругается компилятор:
'WinMain' : function cannot be overloaded
see declaration of 'WinMain'

Re: самое начало...

Добавлено: 20 окт 2009, 12:27
atavin-ta
Я не про него, а про мелкомягких. И "могли" - не значит "сделали". Сделали, по-моему, всё-таки с четырьмя.

Re: самое начало...

Добавлено: 20 окт 2009, 12:32
Eugie
Автор топика, видимо, посмотрел не в тот раздел MSDN :) У ATL класса CWindow и MFC класса CWnd есть методы MessageBox как раз с 3 параметрами. В реализации, конечно, используется WinAPi -шный ::MessageBox с 4 параметрами (хэндл окна, очевидно, берется из контектста самого CWindow/CWnd).

Re: самое начало...

Добавлено: 20 окт 2009, 12:43
atavin-ta
&quot писал(а):'WinMain' : function cannot be overloaded
see declaration of 'WinMain'
Странно.
&quot писал(а):

Код: Выделить всё

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
Разве она перегружена? Я здесь понимаю ещё меньше, чем автор темы. Походу, нужен весь проект целиком, иначе не разберёмся.

Re: самое начало...

Добавлено: 21 окт 2009, 15:54
WinMain
Проблема может быть в том, что проект по умолчанию создан в конфигурации UNICODE, а текстовые строки в программе используются как ANSI.
Можно изменить программный код следующим образом:

Код: Выделить всё

#include <windows.h>
int WINAPI [B]_tWinMain[/B](HINSTANCE hInstance, HINSTANCE hPrevInstance,
[B]LPTSTR[/B] lpCmdLine, int nCmdShow)
{
MessageBox( NULL, [B]_T("Hellow!")[/B], [B]_T("Hellow From message Box")[/B],MB_OK);
return 0;
}
Тогда программа не будет зависеть от конфигурации проекта.

Re: самое начало...

Добавлено: 22 окт 2009, 10:58
mc-black
Вот, WinMain, это правильный ответ! Нутром чувствовал, что дело в UNICODE/ANSI, только сформулировать не мог как сделать, чтобы заработало.