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

  • Автор темы Автор темы Nikitos
  • Дата начала Дата начала
N

Nikitos

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

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

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

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

// вызываю переменную класса CMyDialog, выводится значение типа -92824051 (а должно int - 50)
Помогите плиз
Спасибо
 
<!--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 попробуй
 
Да, передал this вместо GetSafeHwnd(), работает

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

пасиб
 
<!--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]
Ну это надо больше кода видеть, чтобы пытаться помочь... Ну ладно, раз все ОК, то ОК
 
Вообще не рекомендуется передавать указатель на класс MFC
Есть ли способ все-таки привести HWND к CWnd (а именно к классу, производному от CWnd или CDialog)
 
<!--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]
Ну как просвяти почему...

И кем не рекомендуется?
 
Джорджем Шефердом
стр. 228
 
<!--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]
Нет у меня этой книжки. Огласи цитату...
 
Короче смотрите
Вызываю из диалогового окна (производное от 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) ..."
 
<!--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]
Если у тебя только один поток и больше не будет по определению, то почему не проигрорировать это?
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab