Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Обсуждение статей
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2010, 05:13   #1
Pblog
Бот
Администратор
 
Регистрация: 27.05.2007
Сообщений: 182
По умолчанию статья - Простейшая программа WinAPI на C++

Простейшая программа WinAPI на C++

Многие, кто переходит с «учебного» ДОСовского компилятора вроде Borland C++ на визуальное программирование быстро запутываются в сложных библиотеках типа MFC или VCL, особенно из-за того, что новые создаваемые проекты уже содержат с десяток файлов и сложную структуру классов. Рано или поздно встает вопрос: «…а почему нельзя написать оконную программу с простой линейной структурой, состоящую из [...]
Pblog вне форума Ответить с цитированием
Старый 19.06.2011, 22:37   #2
Unique_friend
 
Регистрация: 19.06.2011
Сообщений: 4
По умолчанию

При компиляции кода приведенной в статье программы в MS Visual Studio 2008 Professional выдается 29 ошибок и 2 предупреждения. Ошибки в основном типа "error LNK2028" и "error LNK2019", и одна "fatal error LNK1120". Предупреждения связаны с неявным приведением типа Doudle к Int.
Unique_friend вне форума Ответить с цитированием
Старый 19.06.2011, 22:53   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

кокретно какие ошибки?
полные описания ошибок а не номера.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2011, 00:46   #4
Unique_friend
 
Регистрация: 19.06.2011
Сообщений: 4
По умолчанию

Вот первая:
Цитата:
Error 1 error LNK2028: unresolved token (0A000046) "extern "C" int __stdcall MoveToEx(struct HDC__ *,int,int,struct tagPOINT *)" (?MoveToEx@@$$J216YGHPAUHDC__@@HHPA UtagPOINT@@@Z) referenced in function "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@$$FYGJPAUHWND__@@IIJ@ Z) 1.obj
Вот еще одна:
Цитата:
Error 15 error LNK2019: unresolved external symbol "extern "C" int __stdcall GetMessageW(struct tagMSG *,struct HWND__ *,unsigned int,unsigned int)" (?GetMessageW@@$$J216YGHPAUtagMSG@@ PAUHWND__@@II@Z) referenced in function "extern "C" int __cdecl GetMessage(struct tagMSG *,struct HWND__ *,unsigned int,unsigned int)" (?GetMessage@@$$J0YAHPAUtagMSG@@PAU HWND__@@II@Z) 1.obj
В итоге получилось:
Цитата:
Error 29 fatal error LNK1120: 28 unresolved externals C:\Documents and Settings\Mihail\Мои документы\Visual Studio 2008\Projects\Les_1\Debug\Les_1.exe 1
В предыдущем сообщении плохо вставилась картинка на Гугл.Пикассе

Последний раз редактировалось Unique_friend; 20.06.2011 в 00:49.
Unique_friend вне форума Ответить с цитированием
Старый 20.06.2011, 17:47   #5
Unique_friend
 
Регистрация: 19.06.2011
Сообщений: 4
По умолчанию

Нашел схожую проблему тут: http://social.msdn.microsoft.com/For...-a2ba071ff22a/, но не понял что нужно поменять в исходном примере для успешной компиляции проекта.
Unique_friend вне форума Ответить с цитированием
Старый 20.06.2011, 18:09   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в настройках проекта в список используемых библиотек надо добавить user32.lib(либо в коде #pragma comment(lib,"user32.lib")
и еще проверьте что проект должен быть типа Win32
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.06.2011, 07:24   #7
Unique_friend
 
Регистрация: 19.06.2011
Сообщений: 4
По умолчанию

Добавил в код, теперь стало 7 ошибок вместо 28.

Цитата:
Error 3 error LNK2028: unresolved token (0A000046) "extern "C" int __stdcall MoveToEx(struct HDC__ *,int,int,struct tagPOINT *)" (?MoveToEx@@$$J216YGHPAUHDC__@@HHPA UtagPOINT@@@Z) referenced in function "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@$$FYGJPAUHWND__@@IIJ@ Z) 1.obj
Цитата:
Error 4 error LNK2028: unresolved token (0A000053) "extern "C" int __stdcall LineTo(struct HDC__ *,int,int)" (?LineTo@@$$J212YGHPAUHDC__@@HH@Z) referenced in function "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@$$FYGJPAUHWND__@@IIJ@ Z) 1.obj
Цитата:
Error 7 error LNK2019: unresolved external symbol "extern "C" int __stdcall MoveToEx(struct HDC__ *,int,int,struct tagPOINT *)" (?MoveToEx@@$$J216YGHPAUHDC__@@HHPA UtagPOINT@@@Z) referenced in function "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@$$FYGJPAUHWND__@@IIJ@ Z) 1.obj

Вот сам код:
Код:
#define WIN32_LEAN_AND_MEAN
#pragma comment(lib,"user32.lib")

#include <windows.h>

#include <cmath>

LRESULT CALLBACK WindowProc (HWND, UINT, WPARAM, LPARAM);

HDC dc;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

// Create window

WNDCLASS wc     = {0};

wc.style        = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;

wc.lpfnWndProc  = WindowProc;

wc.hInstance    = hInstance;

wc.hCursor      = LoadCursor (NULL, IDC_ARROW);

wc.lpszClassName= L"CMyWnd";

RegisterClass (&wc);

HWND hWnd = CreateWindow (L"CMyWnd", L"WinMain sample", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 320, 240, NULL, NULL, hInstance, NULL);

dc = GetDC (hWnd);

ShowWindow (hWnd, nCmdShow);

// Message loop (timer, etc)

SetTimer (hWnd, 1, USER_TIMER_MINIMUM, NULL);

MSG msg;

while (GetMessage(&msg,NULL,0,0) > 0)// while not WM_QUIT (0) nor some error (-1)

{

TranslateMessage (&msg);

DispatchMessage (&msg);

}

return msg.wParam;

}

// Message processing function

LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

static bool Move = true;

static int Phase=0, Width, Height;

switch (message)

{

case WM_LBUTTONDOWN:

case WM_RBUTTONDOWN:

Move = !Move;

// no break

case WM_TIMER:

if (Move)

Phase++;

// no break

else

break;

case WM_PAINT:

Rectangle (dc, -1, -1, Width+1, Height+1);

MoveToEx (dc, 0, Height * (0.5 + 0.3*sin(0.1*Phase)), NULL);

for (int i=0; i<Width; i++)

LineTo (dc, i, Height * (0.5 + 0.3*sin(0.1*(i+Phase))) );

break;

case WM_SIZE:

Width  = LOWORD(lParam),

Height = HIWORD(lParam);

break;

case WM_KEYDOWN:

if (wParam != VK_ESCAPE)

break;

// else no break

case WM_DESTROY:

PostQuitMessage (0);

}

return DefWindowProc (hWnd, message, wParam, lParam);

}
В свойствах проекта "Configuration properties -> Linker -> Input -> Additional Dependencies" не стояла галочка у "Inherit from parent or project defaults".
Проставил ее и все скомпилировалось и скомпоновалось.

Вот список библиотек которые туда влезли (какие-то видать не нужны, но одной user32.lib точно не достаточно):
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib

Если будет время, то посмотрю какие lib'ы нужно прописать в проекте, чтобы все успешно запускалось.
Unique_friend вне форума Ответить с цитированием
Старый 23.06.2011, 12:54   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

#pragma comment(lib,"gdi32.lib")

а зачем снимали галку?
линкер все равно не нужное отрежет(при релизе точно)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Требуется простейшая программа на ассемблер(с описанием) Bzeak Фриланс 5 10.01.2013 17:16
Требуется простейшая программа на ассемблер(с описанием) Д/З в инсте хД BANNEDandRRoD Фриланс 8 22.03.2010 22:45
Простейшая программа с импользованием Chart bookkc Помощь студентам 2 16.03.2010 10:37
Первая программа на WINAPI Syltan Win Api 8 27.02.2010 22:38
WinApi, программа должна выдавать основной номер версии ОС MARGO Win Api 2 16.11.2007 21:14