Так а в чем проблема то, непонятно как делать? Нужно значит почитать про 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) {
//тут обычный код, который создает окно. И з приложение эта ф-ция легко дергается.
}