Приведение Hwnd к Cwnd

Тема в разделе "MS Visual C++", создана пользователем Nikitos, 14 сен 2007.

  1. Nikitos

    Nikitos Гость

    Помогите плиз решить задачу
    Создаю рабочий поток, ему передается параметром описатель окна c помощью GetSafeHwnd()

    В потоке я хочу вызвать открытую переменную-член класса, из которого иницирован поток.
    Я делаю так

    // pParam - параметр LPVOID потока
    // CMyDialog - класс диалогового окна, из которого запущен поток

    HWND hDialog = (HWND) pParam;
    CMyDialog* dlg = (CMyDialog*) CWnd::FromHandle(hDialog);

    // вызываю переменную класса CMyDialog, выводится значение типа -92824051 (а должно int - 50)
    Помогите плиз
    Спасибо
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Nikitos+14:09:2007, 11:29 -->
    <span class="vbquote">(Nikitos @ 14:09:2007, 11:29 )</span><!--QuoteEBegin-->ему передается параметром описатель окна c помощью GetSafeHwnd()
    [snapback]78291" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Так передавал бы уже указатель на CMyDialog<!--QuoteBegin-Nikitos+14:09:2007, 11:29 -->
    <span class="vbquote">(Nikitos @ 14:09:2007, 11:29 )</span><!--QuoteEBegin-->Помогите плиз
    [snapback]78291" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    CWnd::Attach попробуй
     
  3. Nikitos

    Nikitos Гость

    Да, передал this вместо GetSafeHwnd(), работает

    Attach (HWND) пробовал, там липо assertation failure либо не работает

    пасиб
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Nikitos+14:09:2007, 11:44 -->
    <span class="vbquote">(Nikitos @ 14:09:2007, 11:44 )</span><!--QuoteEBegin-->Attach (HWND) пробовал, там липо assertation failure либо не работает
    [snapback]78294" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Ну это надо больше кода видеть, чтобы пытаться помочь... Ну ладно, раз все ОК, то ОК
     
  5. Nikitos

    Nikitos Гость

    Вообще не рекомендуется передавать указатель на класс MFC
    Есть ли способ все-таки привести HWND к CWnd (а именно к классу, производному от CWnd или CDialog)
     
  6. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Nikitos+14:09:2007, 11:50 -->
    <span class="vbquote">(Nikitos @ 14:09:2007, 11:50 )</span><!--QuoteEBegin-->Вообще не рекомендуется передавать указатель на класс MFC
    [snapback]78297" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Ну как просвяти почему...

    И кем не рекомендуется?
     
  7. Nikitos

    Nikitos Гость

    Джорджем Шефердом
    стр. 228
     
  8. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Nikitos+14:09:2007, 12:44 -->
    <span class="vbquote">(Nikitos @ 14:09:2007, 12:44 )</span><!--QuoteEBegin-->Джорджем Шефердом
    стр. 228
    [snapback]78305" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Нет у меня этой книжки. Огласи цитату...
     
  9. Nikitos

    Nikitos Гость

    Короче смотрите
    Вызываю из диалогового окна (производное от CDialog) новый поток, ему передаю параметр GetSafeHwnd() - тот же CMyDialog->m_hWnd насколько я понимаю...

    Теперь внутренности рабочего потока.

    HWND Hwnd = (HWND) pParam; // - получаем описатель Окна
    CMyDialog* dlg = (CMyDialog*) CWnd::FromHandle(Hwnd); // получаю указатель на CWnd и пытаюсь его привести к классу CMyDialog
    Запускаю приложение, трэйсом пытаюсь вывести открытую переменную CMyDialog типа int и равную 50 - результат - -892372751

    если добавить это
    dlg->Attach(Hwnd); // возникает ошибка Debug assertation


    //////////////////////

    Теперь цитата из книги
    "...Но почуме бы не передать вместо описателя указатель на объект "окно"? Это может оказаться опасным, так как нельзя полагаться на то, что этот объект будет существовать постоянно (это можно проигнорировать я думаю), и, кроме того, разным потокам не разрешается совместно использовать объекты MFC-классов. Это правило не распространяется на объекты классов, производных непосредственно от CObject, и такие простые объекты как CString и CRect) ..."
     
  10. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    <!--QuoteBegin-Nikitos+14:09:2007, 13:45 -->
    <span class="vbquote">(Nikitos @ 14:09:2007, 13:45 )</span><!--QuoteEBegin-->кроме того, разным потокам не разрешается совместно использовать объекты MFC-классов
    [snapback]78318" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Если у тебя только один поток и больше не будет по определению, то почему не проигрорировать это?
     
Загрузка...
Похожие Темы - Приведение Hwnd Cwnd
  1. Normann
    Ответов:
    2
    Просмотров:
    3.335

Поделиться этой страницей