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

Создание окна из dll (?)

Добавлено: 21 фев 2008, 19:20
Coderik
Почему может не создаваться окно?
Код библиотеки:
Регистрация класса выглядит так

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

BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved)
{
	switch(dwReason)
	{
	case DLL_PROCESS_ATTACH:
		WNDCLASSEX wclass;
		memset(&wclass, 0, sizeof(WNDCLASSEX));
		wclass.cbSize = sizeof(wclass);
		wclass.style = CS_GLOBALCLASS;
		wclass.lpfnWndProc = WndProc;
		wclass.cbClsExtra = 0;
		wclass.cbWndExtra = 0;
		wclass.hInstance = hModule;
		wclass.hIcon = NULL;
		wclass.hIconSm = NULL;
		wclass.hCursor = NULL;
		wclass.hbrBackground = CreateSolidBrush(RGB(205,210,215));
		wclass.lpszMenuName = NULL;
		wclass.lpszClassName = szClassName;
		RegisterClassEx(&wclass);
		break;
	}
	return TRUE;
}
Создание производится в функции библиотеки, которая вызывается из основного приложения

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

HWND SetFunction(HWND hParent, HINSTANCE hInstance)
{	
	HWND hWnd
	hWnd = CreateWindowEx(WS_EX_TRANSPARENT, szClassName, "Caption", WS_CHILD, 10,10,10,10, hParent, NULL, hInstance, NULL);
	return hWnd;
}
RegisterClassEx возвращает не 0, а вот CreateWindowEx возвращает NULL. При этом GetLastError возвращает ERR_NO_ERROR.

WndProc основного окна:

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

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_CREATE:
		/*подключение библиотек*/
                hMdl = (*pMdl).Set(hWnd,hInst); //вызов импортированой из dll SetFunction(HWND,HINSTANCE) 
		break;
	case WM_CLOSE:
		DestroyWindow(hWnd);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0;
}	


В чем может быть косяк?

Re: Создание окна из dll (?)

Добавлено: 26 фев 2008, 10:27
Hawk
Возможно проблема в обработке WM_CREATE процедуры этого клиентского окна

Re: Создание окна из dll (?)

Добавлено: 26 фев 2008, 11:05
WinMain
Вообще-то лучше было бы процедуру регистрации оконного класса не привязывать к функции DllMain(), а вынести её в отдельную функцию. Эта функция также экспортируется и вызывается при запуске основного приложения, до создания его главного окна. А уже при обработке события WM_CREATE происходит вызов функции, создающей твоё окно.

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

hMdl = (*pMdl).Set(hWnd,hInst); //вызов импортированой из dll SetFunction(HWND,HINSTANCE)
Действительно, как-то странно выглядит вызов импортируемой функции. Возможно здесь тоже что-то не так.