Создание окна в потоке с помощью ф-й 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
Re: Создание окна в потоке с помощью ф-й WINAPI (в dll)
От: Pavel Dvorkin Россия  
Дата: 14.12.06 11:19
Оценка:
Здравствуйте, niko_, Вы писали:

_>Помогите разобраться с проблемой:

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

Уверен ? Проверь в отладчике, не 0 ли у тебя в MyWnd ?


_>// До тела цикла не доходит и из цикла не выходит

_>//

Это как такое может быть ?
With best regards
Pavel Dvorkin
Re: Создание окна в потоке с помощью ф-й WINAPI (в dll)
От: Danchik Украина  
Дата: 14.12.06 14:14
Оценка: +1
Здравствуйте, niko_, Вы писали:

_>Помогите разобраться с проблемой:

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

[Skip]
Вот так все прекрасно работает. Обратите внимание на то что вы пропустили (болдом)

procedure TMyThread.Execute;
var
  WindowClass   : TWndClassEx;
  TempClass     : TWndClassEx;
  aWindowHandle : HWnd;
  Mmsg          : TMsg;
begin
  FillChar(WindowClass, SizeOf(WindowClass), 0);
  WindowClass.cbSize        := SizeOf (WindowClass);
  WindowClass.style         := CS_HREDRAW or CS_VREDRAW;
  WindowClass.lpfnWndProc   := @DefWindowProc;
  WindowClass.cbClsExtra    := 0;
  WindowClass.cbWndExtra    := 0;
  WindowClass.hInstance     := HInstance;
  WindowClass.hIcon         := LoadIcon (0,IDI_APPLICATION);
  WindowClass.hCursor       := LoadCursor (0,IDC_ARROW);
  WindowClass.hbrBackground := CreateSolidBrush(RGB(182, 219, 255));
  WindowClass.lpszMenuName  := nil;
  WindowClass.lpszClassName := 'NameClass';

  if not GetClassInfoEx(HInstance, WindowClass.lpszClassName, TempClass) then
  begin
    WindowClass.hInstance := HInstance;
    if Windows.RegisterClassEx(WindowClass) = 0 then
      RaiseLastOSError;
  end;

  aWindowHandle:= CreateWindowEx(WS_EX_TOPMOST, 'NameClass', 'NameWindows', WS_POPUP or WS_VISIBLE, 0, 0, 300, 100, 0, 0, HInstance, nil);
  
  while GetMessage(Mmsg,0,0,0) do
  begin
    TranslateMessage(Mmsg);
    DispatchMessage(Mmsg);
  end;
end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.