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

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
Coderik
Сообщения: 1
Зарегистрирован: 21 фев 2008, 19:10

Почему может не создаваться окно?
Код библиотеки:
Регистрация класса выглядит так

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

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;
}	


В чем может быть косяк?
Hawk
Сообщения: 216
Зарегистрирован: 17 фев 2004, 14:52
Откуда: СПб
Контактная информация:

Возможно проблема в обработке WM_CREATE процедуры этого клиентского окна
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

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

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

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