Понедельник, 02 Декабря 2024, 13:08

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Создание окна Win32 через DLL??!
lumennesДата: Пятница, 05 Октября 2012, 06:25 | Сообщение # 1
Убийца Diablo
Сейчас нет на сайте
Я начал писать движок C++ на OpenGL. В общем движок будет в виде dll, подключаемой к проекту, в связи с этим такой вопрос:
Как реализовать создание окна Win32 через DLL??!

То есть, например, вызываем функцию Init(800, 600), которая создает окно Win32 с переданными значениями ширины и высоты, через dll.

Очень прошу мне помочь. Перерыл пол инета, но ничего рабочего не нашел, так что сообщения типа "гули" ИГНОРИРУЮТСЯ!.
Заранее спасибо за помощь.


Как мало вы знаете, как громко вы судите...

Сообщение отредактировал lumennes - Пятница, 05 Октября 2012, 06:26
ArchidoДата: Пятница, 05 Октября 2012, 09:02 | Сообщение # 2
Сэнсэй
Сейчас нет на сайте
Так а в чем проблема то, непонятно как делать? Нужно значит почитать про DLL библиотеки и все сразу станет ясно. Создание окна через DLL ничем не отличается от создания окна, непосредствено, в экзешнике. Отличается только способ вызова ф-ций.

В кратце, при создании DLL в дополнении создается и .lib файл, который используется для связывания ф-ций, находящихся в DLL, с твоим приложением. Обычно кроме этого существует еще и хедер (.h) с объявлением экспортируемых (а на другой стороне - импортируемых) ф-ций.

Например есть некий Header.h, в нем такой код:
Code

#define ENGINE_API __stdcall
#define ENGINE_EXPORT extern "C" __declspec(dllexport)
#define ENGINE_IMPORT extern "C" __declspec(dllimport)

#ifdef ENGINE_HEADER_ONLY  //Обявляется в приложении
ENGINE_IMPORT bool ENGINE_API Intialize (int Width, int Height);
#else
ENGINE_EXPORT bool ENGINE_API Intialize (int Width, int Height);
#endif

По умолчанию если заинклудить данный хедер, то будет объявлена ф-ция Initialize в качестве эскпортируемой из движка (и использовать ее можно только в DLL движка ). В приложении перед инклудом данного хедера объявляется директива ENGINE_HEADER_ONLY и в результате ф-ция объявится как импортируемая (из DLL), а чтобы оно нашло реализацию этой ф-ции - нужно прилинковать одноименный .lib файл. И можно будет легко звать эту ф-цию из DLLки.

В самом движке она реализуется обычно (например какой-нить Core.cpp):
Code

#include "Header.h"

bool ENGINE_API Intialize (int Width, int Height) {

//тут обычный код, который создает окно. И з приложение эта ф-ция легко дергается.

}


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Пятница, 05 Октября 2012, 09:04
lumennesДата: Среда, 10 Октября 2012, 22:54 | Сообщение # 3
Убийца Diablo
Сейчас нет на сайте
Ура! Я сделал это!

Как не странно через dllmain.

И при подключении dll через LoadLibrary.

При запуске программа создает окно Win32 через dll.

Archido, спс, что пытался помочь, держи +.


Как мало вы знаете, как громко вы судите...
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг