Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание окна с помощью CreateWindowEx в Си [WinXP]


niko ©   (2006-12-15 13:20:00) 

В чём дело? Пишу код в dll. При её загрузки генерирую поток и в нём создаю окно, предварительно зарегесрировав класс данного окна. Почему то окно не создаётся, CreateWindowEx возвращает NULL (код ошибки = 6).


   MyWnd = CreateWindowEx(WS_EX_TOPMOST,"ClassName","WindowName",WS_POPUP | WS_VISIBLE,
                           0 , 0, 300, 100,
                           0 , 0, hModule, NULL);


niko   (2006-12-15 16:35:00) [1]


> [16] clickmaker ©   (15.12.06 16:30) 

Чувак, ты крут!!!

Спасибо - наконец то заработало.


clickmaker   (2006-12-15 16:30:00) [2]


> [15] niko ©   (15.12.06 16:22)

LRESULT
WINAPI WindowProc  (HWND   wnd,
   unsigned int msg,
   WPARAM   wparam,
   LPARAM   lparam)
{
switch (msg)
{
 case WM_CREATE:
   return 0;
}
return DefWindowProc(wnd, msg, wparam, lparam);
}


niko   (2006-12-15 16:22:00) [3]


LRESULT
WINAPI WindowProc  (HWND   wnd,
    unsigned int msg,
    WPARAM   wparam,
    LPARAM   lparam)
{
return 0;
}


clickmaker   (2006-12-15 16:16:00) [4]


> [13] niko ©   (15.12.06 16:05)

если RegisterClassEx сработала успешно, то в GetLastError может быть значение, оставшееся там от какой-то предыдущей ошибки
if ( RegisterClassEx() == 0 )
{
 _err =
..
}

WindowProc как объявлена?


niko   (2006-12-15 16:05:00) [5]


> [12] clickmaker ©   (15.12.06 15:46)

Вот весь код функции:


void CreateMyForm()
{
window.cbSize   = sizeof (window);
window.style         = CS_HREDRAW | CS_VREDRAW;
window.lpfnWndProc   = WindowProc;
window.cbClsExtra    = 0;
window.cbWndExtra    = 0;
window.hInstance     = (HINSTANCE)Dll_hModule;
window.hIcon         = LoadIcon (0,IDI_APPLICATION);
window.hIconSm   = NULL;
window.hCursor       = LoadCursor (0,IDC_ARROW);
window.hbrBackground = CreateSolidBrush(RGB(182, 219, 255));
window.lpszMenuName  = NULL;
window.lpszClassName = "ClassName";
RegisterClassEx(&window);

_err= GetLastError(); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ARGUMENT_ARRAY, NULL, _err, 0, Buffer_err,sizeof(Buffer_err), NULL);
OutInfo(Buffer_err, _err);

   MyWnd = CreateWindowEx(WS_EX_TOPMOST,"ClassName","WindowName",WS_POPUP | WS_VISIBLE,
                           0 , 0, 300, 100,
                           NULL , NULL, (HINSTANCE)Dll_hModule, NULL);
ShowWindow(MyWnd, SW_SHOW);
   while (GetMessage(&Mmsg, NULL, NULL, NULL))
   {
 TranslateMessage(&Mmsg);
 DispatchMessage(&Mmsg);
   }
}


GetLastError = 2 ("The system cannot find the file specified.")


clickmaker   (2006-12-15 15:46:00) [6]


> GetLastError = "The system cannot find the file specified."

а это тут причем? где у тебя обращение к файлам?


niko   (2006-12-15 15:29:00) [7]


> [10] clickmaker ©   (15.12.06 15:07)


А можно по подробней как правельно создовать свой класс и регестировать его? (на примере)
Может я где какую мелочь упустил.

Мой класс не регестрируется. GetLastError = "The system cannot find the file specified."


clickmaker   (2006-12-15 15:07:00) [8]


> [9] niko ©   (15.12.06 14:32)

если уж RegisterClassEx, тогда надо и hIconSm указывать. Иначе можно и без Ex обойтись


niko   (2006-12-15 14:32:00) [9]

Класс создавал так:


WNDCLASSEX window;
. . . . . .

window.cbSize   = sizeof (window);
window.style         = CS_HREDRAW | CS_VREDRAW;
window.lpfnWndProc   = WindowProc;
window.cbClsExtra    = 0;
window.cbWndExtra    = 0;
window.hInstance     = hModule; // теперь согласен и на NULL
window.hIcon         = LoadIcon (0,IDI_APPLICATION);
window.hCursor       = LoadCursor (0,IDC_ARROW);
window.hbrBackground = CreateSolidBrush(RGB(182, 219, 255));
window.lpszMenuName  = NULL;
window.lpszClassName = "ClassName";
RegisterClassEx(&window);


Заработало когда при создании формы указал название класса не "ClassName", а "ComboBox".


clickmaker   (2006-12-15 14:18:00) [10]


> [7] niko ©   (15.12.06 14:10)

а что за класс и как создал? И что за стандартный?


niko   (2006-12-15 14:10:00) [11]

Всем спасибо!

Я вроде как класс не правельно создал (прописал стандартный - заработало). Хотя в Delphi мой класс работает нормально.


BiN   (2006-12-15 14:03:00) [12]

Пардон, не учел замечание Сергея М про popup-окна. Но все равно попробуй -)


BiN   (2006-12-15 13:58:00) [13]

Попробуй типа
  MyWnd = CreateWindowEx(WS_EX_TOPMOST,"ClassName","WindowName",WS_POPUP | WS_VISIBLE,
                          0 , 0, 300, 100,
                          GetForegroundWindow, 0, hModule, NULL);


Сергей М.   (2006-12-15 13:51:00) [14]


> clickmaker ©   (15.12.06 13:42) [3]


А мож у него для тек.приложения выставлен режим совместимости с Маздаем ?

Просто иных предположений в этих условиях пока нет. Род.окно, согласно справке, можно не указывать (оно опционально), если в стиле указан WS_POPUP.


clickmaker   (2006-12-15 13:42:00) [15]

MSDN, CreateWindowEx

hInstance
[in] Windows 95/98/Me: Handle to the instance of the module to be associated with the window.
Windows NT/2000/XP: This value is ignored


niko   (2006-12-15 13:37:00) [16]

Проверял имя файла на который указывает hModule - всё правельно!


Сергей М.   (2006-12-15 13:29:00) [17]

Похоже на то, что параметр hModule содержит некорректное значение, а именно не явзяется действительным хэндлом модуля, действительно существующего в АП тек.процесса.


Наверх

Титульная страница Поиск, карта сайта Написать письмо