Проблема с потоком в DLL

Тема в разделе "WASM.WIN32", создана пользователем ksu_ant, 13 фев 2007.

  1. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Здравствуйте!
    Возникла такая проблема: пишу библиотеку, которая должна немодально вызываться из определенного процесса. В ней есть окна.
    Иногда возникает ситуация, когда окно не появляется.
    Код (Text):
    1. DWORD MessageLoop(LPVOID lpParam)
    2. {
    3. MSG  msg;
    4. HINSTANCE hInstance;
    5.  
    6. hInstance=hDLL;
    7. //MessageBox(NULL,"MessageLoop","MessageLoop",MB_OK);
    8. Sleep(2000);
    9.    if(!InitApplication(hInstance))
    10.       return FALSE;
    11. InitCommonControls();
    12. if (!InitInstance(hInstance, 1))
    13.    return FALSE;
    14.  
    15.      ShowWindow(hWnd,SW_MINIMIZE);
    16.      UpdateWindow(hWnd);
    17.      ShowWindow(hWnd,SW_HIDE);
    18.      while(GetMessage( &msg, NULL, 0x00, 0x00))
    19.      {
    20.         TranslateMessage(&msg);
    21.         DispatchMessage(&msg);
    22.      }
    23.      return 0;
    24. }
    25.  
    26. ...
    27. DWORD ThreadId;
    28. ...
    29. hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MessageLoop, NULL, 0, &ThreadId);
    Если выводить сообщение (убрать комментарий), то всегда вызывается правильно, если же нет MessageBox - иногда не рисуется окно (оно в трей должно свернуться).
    Кто знает как это можно вылечить и в чем причина такого поведения.
    Заранее благодарен.
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    CreateThread вызывается из DllMain?
     
  3. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    gilg
    Нет.
    Она из экспортируемой функции вызывается. А та, в свою очередь, запускает это все на исполнение.
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    А не может это случаться банально из-за того, что MessageBox дополнительную задержку обеспечивает? Судя по Sleep, твоя длл ждет чего-то от основного приложения...
     
  5. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    gilg
    Нет, Sleep здесь - это как раз проверка предположения о задержке. Я тоже так подумал - ничего не изменилось. Просто забыл Sleep убрать. Он никак не влияет на происходящее.
     
  6. ksu_ant

    ksu_ant New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    273
    Сейчас попробовал использовать вместо MessageBox вот это
    Код (Text):
    1. DialogBox(hInstance, MAKEINTRESOURCE(IDD_DLG), GetForegroundWindow(), DlgProc);
    А в процедуре инициализации уничтожать - также не работает. MessageBox ему болльше нравится...