Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание окна из dll (?)  (Прочитано 11646 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Coderik
Гость
« : 20-02-2008 12:08 » 

Почему может не создаваться окно?
Код библиотеки:
Регистрация класса выглядит так
Код:
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. В чем может быть косяк?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 20-02-2008 12:21 » 

а GetLastError что вертает ?

и ещё в мсдн приписка
Цитата
This function typically fails for one of the following reasons:

an invalid parameter value
the system class was registered by a different module
the WH_CBT hook is installed and returns a failure code
the window procedure fails for WM_CREATE or WM_NCCREATE

Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 20-02-2008 13:22 » 

Покажи WndProc также. При иницилизации можно при определеных обстоятельствах запретить создание элемента. Меня интересует, как обрабатывается сообшение WM_CREATE.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Coderik
Гость
« Ответ #3 : 20-02-2008 22:34 » 

Как ни странно, 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;
}
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 21-02-2008 04:50 » 

Финч угадал )

в
Код:
case WM_CREATE:
{
  return 1; //это ты забыл сделать
}
break;
такая же фигня про другие обработчики - а чиво эт они у тебя ничего не вернули? А возвращается общий 0
Записан

Coderik
Гость
« Ответ #5 : 21-02-2008 15:28 » 

Проблема в том, что создание окна из библиотеки происходит во время обработки сообщения WM_CREATE основного окна. То есть до возврата любых значений.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 21-02-2008 21:43 » 

Леш, я не угадал Жаль
Читаем http://msdn2.microsoft.com/en-us/library/ms914118.aspx
Цитата
Return Values

If an application processes this message, it should return 0 to continue creation of the window. If the application returns –1, the window is destroyed and the CreateWindowEx or CreateWindow function returns a NULL handle.

Так что все как бы правильно. Класс компоненты объявлен правильно, Возрат правильного значения. Меня смушает только эта строка:
Код:
hMdl = (*pMdl).Set(hWnd,hInst); //вызов импортированой из dll SetFunction(HWND,HINSTANCE)

Coderik, Ты резал код, или у тебя именно так написано? Импортированной откуда? У тебя WndProc находится в том же модуле, что и регистрация класса компоненты?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Coderik
Гость
« Ответ #7 : 21-02-2008 22:01 » 

Finch, у меня несколько путанее в коде.
Код:
BlInf = (*pMdl).Set(hWnd,hInst);
Т.е. SetFunction() возвращает структуру, в которой в том чисте присутствует дескриптор окна, но суть не меняется. Регистрация класса у меня осуществляется внутри dll при ее подключении. WndProc для этого класса также находится в dll. (Или я не так вопрос понял?)
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 23-02-2008 08:42 » 

Читаем http://msdn2.microsoft.com/en-us/library/ms633574(VS.85).aspx
Цитата
Windows NT/Windows 2000/Windows XP: To create a class that can be used in every process, create the window class in a .dll and load the .dll in every process. To load the .dll in every process, add its name to the AppInit_DLLs value in following registry key:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows

Судя по описанию, нужно еше Dll глобального класса регистировать в регистре.

« Последнее редактирование: 23-02-2008 08:48 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
SergI
Гость
« Ответ #9 : 09-03-2008 15:37 » 

Код:
[quote author=Coderik link=topic=14162.msg166784#msg166784 date=1203509300]
Почему может не создаваться окно?
...
wclass.hInstance = hModule;
...
hWnd = CreateWindowEx(WS_EX_TRANSPARENT, szClassName, "Caption", WS_CHILD, 10,10,10,10, hParent, NULL, hInstance, NULL);
...

RegisterClassEx возвращает не 0, а вот CreateWindowEx возвращает NULL. В чем может быть косяк?
[/quote]


 Обрати внимание на hInstance.
 В одном случае ты используешь hInstance, в другом -  hModule.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines