Вниз
Скачать: CL | DM;

Создание окна в потоке с помощью ф-й WINAPI (в dll)   Найти похожие ветки 

 
niko ©   (2006-12-14 14:08) [0]

Помогите разобраться с проблемой:
 в VC++ работаю с dll. При её присоединении к процесу создаю отдельный поток и с помощью функций WINAPI в нём создаю окно, после чего обрабатываю GetMessage (код приведён ниже). Так вот на первом же вызове GetMessage поток стопорится и самое интересное что форма так и не появляется, хотя ShowWindow(MyWnd, SW_SHOW) сработало нормально.
 Точно такойже код, но в Delphi работает,как не странно, нормально.Правдо сам поток создаю не средствами WINAPI, а с помощью класса TThread и создание формы происходит в ф-и TMyThread.Execute

Ниже приведён код на Delphi:

   window.cbSize        := SizeOf (window);
   window.style         := CS_HREDRAW or CS_VREDRAW;
   window.lpfnWndProc   := @WindowProc;
   window.cbClsExtra    := 0;
   window.cbWndExtra    := 0;
   window.hInstance     := HInstance;
   window.hIcon         := LoadIcon (0,IDI_APPLICATION);
   window.hCursor       := LoadCursor (0,IDC_ARROW);
   window.hbrBackground := CreateSolidBrush(RGB(182, 219, 255));
   window.lpszMenuName  := nil;
   window.lpszClassName := "NameClass";
   RegisterClassEx (window);
   Mwindow:=CreateWindowEx(WS_EX_TOPMOST,"NameClass","NameWindows",WS_POPUP or WS_VISIBLE, 0 , 0, 300, 100, 0 , 0, HInstance, nil);
   ShowWindow(Mwindow,SW_SHOW);
   while GetMessage(Mmsg,0,0,0) do
   begin
     TranslateMessage(Mmsg);
     DispatchMessage(Mmsg);
   end;


Ниже приведён код на C:

   window.cbSize        = sizeof (window);
   window.style         = CS_HREDRAW | CS_VREDRAW;
   window.lpfnWndProc   = WindowProc;
   window.cbClsExtra    = 0;
   window.cbWndExtra    = 0;
   window.hInstance     = GetMyDllInstance();
   window.hIcon         = LoadIcon (0,IDI_APPLICATION);
   window.hCursor       = LoadCursor (0,IDC_ARROW);
   window.hbrBackground = CreateSolidBrush(RGB(182, 219, 255));
   window.lpszMenuName  = NULL;
   window.lpszClassName = "NameClass";
   RegisterClassEx(&window);
   MyWnd = CreateWindowEx(WS_EX_TOPMOST,"NameClass","NameClass",WS_POPUP | WS_VISIBLE, 0 , 0, 300, 100, 0 , 0, GetMyDllInstance(), NULL);
   ShowWindow(MyWnd, SW_SHOW);
//
//    До тела цикла не доходит и из цикла не выходит
//
   while (GetMessage(&Mmsg, NULL, NULL, NULL))
   {
       TranslateMessage(&Mmsg);
       DispatchMessage(&Mmsg);
   }


 
BiN ©   (2006-12-14 14:17) [1]


>  GetMyDllInstance()

?


 
Игорь Шевченко ©   (2006-12-14 14:21) [2]

Про GetLastError забыли ?


 
niko ©   (2006-12-14 14:42) [3]

GetMyDllInstance() - определяет хендл этой dll в формате HINSTANCE


 
niko ©   (2006-12-14 14:46) [4]

Программа зависает при вызове GetMessage - она не возвращает управление, соответственно GetLastError не вызвать.


 
clickmaker ©   (2006-12-14 15:00) [5]

PeekMessage(&Mmsg, NULL, WM_USER, WM_USER, PM_NOREMOVE);

ShowWindow(MyWnd, SW_SHOW);
UpdateWindow(MyWnd);

while (GetMessage(&Mmsg, NULL, NULL, NULL))
{


 
niko ©   (2006-12-14 15:26) [6]

clickmaker: попробовал, та же история что и раньше. Вызывается GetMessage, и она не возвращает управление


 
Игорь Шевченко ©   (2006-12-14 15:32) [7]

Ну так нету сообщений...Может, у тебя в оконной процедуре ошибка



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.033 c
2-1177291252
Abcdef123
2007-04-23 05:20
2007.05.13
Как организовать поиск по всему проекту на наличие имени таблицы


15-1176546874
parus
2007-04-14 14:34
2007.05.13
ASP VB Script


8-1154363286
Василий
2006-07-31 20:28
2007.05.13
Отображение картинки в DrawGrid


2-1177350935
Сорокин М
2007-04-23 21:55
2007.05.13
округление double


2-1177495186
cvg
2007-04-25 13:59
2007.05.13
эстетичное обращение к последнему элементу массива




   Наверх