Создание окна в потоке с помощью ф-й WINAPI (в dll)
От: niko_ Россия www.KGBSpy.ru
Дата: 14.12.06 10:53
Оценка:
Помогите разобраться с проблемой:
в 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);
}
The truth is out there
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.