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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2010, 19:54   #1
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию gcc и winapi

Под виндой у меня стоит NetBeans IDE 6.9, компилятор gcc (MynGW+MSys). и я решил поучить WinApi. Заметил почти сразу, что мой комплятор не согласен с тем кодом, который предлагают в книге.
Первое - что использовать надо главной функцией не int WINAPI а int APIENTRY. Но это ладно, запомнил. А теперь пишу хеллоу ворд
Код:
// Hello1.cpp
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
///////////////////////////////////////////////////////////////////////////////////////////////
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	HWND hMainWnd;
	char szClassName[] = "MyClass";
	MSG msg;
	WNDCLASSEX wc;

	// Заполняем структуру класса окна
	wc.cbSize        = sizeof(wc);
	wc.style         = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc   = WndProc;
	wc.cbClsExtra	 = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = hInstance;
	wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = szClassName;
	wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

	// Регистрируем класс окна
	if (!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Cannot register class", "Error", MB_OK);
		return 0;
	}

	// Создаем основное окно приложения
	hMainWnd = CreateWindow(
		szClassName, "A Hello1 Application", WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
		(HWND)NULL, (HMENU)NULL,
		(HINSTANCE)hInstance, NULL
	);

	if (!hMainWnd) {
		MessageBox(NULL, "Cannot create main window", "Error", MB_OK);
		return 0;
	}

	// Показываем наше окно
	ShowWindow(hMainWnd, nCmdShow);
//	UpdateWindow(hMainWnd);

	// Выполняем цикл обработки сообщений до закрытия приложения
	while (GetMessage(&msg, NULL, 0, 0))  {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}
///////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	HDC hDC;
	PAINTSTRUCT ps;
	RECT rect;

	switch (msg)
	{
	case WM_PAINT:
		hDC = BeginPaint(hWnd, &ps);

		GetClientRect(hWnd, &rect);
		DrawText(hDC, "Hello, World!", -1, &rect,
			DT_SINGLELINE | DT_CENTER | DT_VCENTER );

		EndPaint(hWnd, &ps);
		return 0;

	case WM_CLOSE:
		DestroyWindow(hWnd);
		return 0;

    case WM_DESTROY:
		PostQuitMessage(0);
		return 0;

	default:
		return DefWindowProc(hWnd, msg, wParam, lParam);
	}

	return 0;
}
Это код из книги, но он не работает у меня. Компилятор говорит вот так:
Цитата:
"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/d/ProperAtlast/CppApplication_1'
"/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/MinGW_1-Windows/cppapplication_1.exe
make[2]: Entering directory `/d/ProperAtlast/CppApplication_1'
mkdir -p dist/Debug/MinGW_1-Windows
g++.exe -o dist/Debug/MinGW_1-Windows/cppapplication_1 build/Debug/MinGW_1-Windows/main.o
make[2]: Leaving directory `/d/ProperAtlast/CppApplication_1'
build/Debug/MinGW_1-Windows/main.o: In function `WinMain':
D:/ProperAtlast/CppApplication_1/main.cpp:22: undefined reference to `GetStockObject@4'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/MinGW_1-Windows/cppapplication_1.exe] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
make[1]: Leaving directory `/d/ProperAtlast/CppApplication_1'

BUILD FAILED (exit value 2, total time: 1s)
Что бы это могло значить, и как это исправить?
Я понимаю, что могу погуглить по ошибке "undefined reference to `GetStockObject@4'", но мне важнее понять что сделать, как настроить компилятор и т.д., что бы таких ошибок больше не было. Ведь код то верный, но gcc он не нравится (а я не хочу менять компилятор и ИДЕ). Короче, может быть есть какие-то рекомендации, мануалы, своды правил о том, как программировать под винду, используя gcc?
bullvinkle вне форума Ответить с цитированием
Старый 20.06.2010, 21:12   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Не подключили либу. Как-то так -lgdi32
p51x вне форума Ответить с цитированием
Старый 21.06.2010, 00:03   #3
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию

А как ее подключить?
Если я в настройках компилятора команду make меняю на C:\msys\1.0\bin\make.exe -lgdi32 , то она становится красной и при попытке компилить, меня выкидывает на страницу настроек.
Я не знаю как передать этот параметр.
bullvinkle вне форума Ответить с цитированием
Старый 21.06.2010, 07:50   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

В Makefile проекта или настройках используемых либ.
p51x вне форума Ответить с цитированием
Старый 21.06.2010, 16:21   #5
bullvinkle
Временно — юрист.
Форумчанин
 
Аватар для bullvinkle
 
Регистрация: 31.03.2008
Сообщений: 204
По умолчанию

спасибо, я разобрался как исправлять такие ошибки (в MSDN нужно смотреть какая библиотека необходима). Но вот западло: библиотеки Gdi32.lib нет у меня на компьютере. Нехорошо.
Не подскажите, где ее можно скачать? и одинаковы ли все библиотеки для компиляторв? Или если у меня gcc, то и либа для него особая?

UPD нашел. Пришлось установить Борланд билдер и взять от туда.

Последний раз редактировалось bullvinkle; 21.06.2010 в 16:32.
bullvinkle вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
gcc inline assembler - обнуление переменной gvf Помощь студентам 1 13.06.2010 19:33
команда addswl, linux, gcc rand8154 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 22.10.2009 08:02
проблема с gcc d9m0n Qt и кроссплатформенное программирование С/С++ 6 04.09.2009 02:30
вопрос по GCC XAOC-forever Qt и кроссплатформенное программирование С/С++ 7 07.04.2009 19:17
inline asm в gcc drRobert Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 23.08.2008 10:26