• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

Nikitos

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

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

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

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

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

European

<!--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 попробуй
 
N

Nikitos

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

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

пасиб
 
E

European

<!--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]
Ну это надо больше кода видеть, чтобы пытаться помочь... Ну ладно, раз все ОК, то ОК
 
N

Nikitos

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

European

<!--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]
Ну как просвяти почему...

И кем не рекомендуется?
 
E

European

<!--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]
Нет у меня этой книжки. Огласи цитату...
 
N

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) ..."
 
E

European

<!--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]
Если у тебя только один поток и больше не будет по определению, то почему не проигрорировать это?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!