Форум: "WinAPI";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];
ВнизСоздание окна в потоке с помощью ф-й 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.054 c