информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Атака на InternetSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Крупный взлом GoDaddy 
 Просроченный сертификат ломает... 
 Phrack #70/0x46 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Find Common Dialog 08.06.01 02:38  
Автор: LBH Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Привет, All!

сделал в MFC-шной проге FindText диалог через апи, отлавливаю когда нажимается кнопка Find, вывожу на экран то что искалось:
if(message==WM_FINDMESSAGE)
{

LPFINDREPLACE lpfr= (LPFINDREPLACE)lParam;

if (lpfr->Flags & FR_FINDNEXT)
{
MessageBox(lpfr->lpstrFindWhat);
}
}
но ничего не выводится - в чем дело? по адресу lpfr->lpstrFindWhat пусто, хотя половина элементов по адресу lprf содержат верные значения. где копать?

Буй!
[Win32] Find Common Dialog 08.06.01 03:14  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Привет, All!
>
> сделал в MFC-шной проге FindText диалог через апи,
> отлавливаю когда нажимается кнопка Find, вывожу на экран то
> что искалось:
> if(message==WM_FINDMESSAGE)
> {
>
> LPFINDREPLACE lpfr= (LPFINDREPLACE)lParam;
>
> if (lpfr->Flags & FR_FINDNEXT)
> {
> MessageBox(lpfr->lpstrFindWhat);
> }
> }
> но ничего не выводится - в чем дело? по адресу
> lpfr->lpstrFindWhat пусто, хотя половина элементов по
> адресу lprf содержат верные значения. где копать?
>
> Буй!

тут сразу фиг поймешь. я не понял - lpfr->lpstrFindWhat вообще пуст, или MessageBox не выводит на экран?
и еще, если ты пишешь через АПИ, то MessageBox - у тебя какой АПИшный или МФСишный?
еще через что ты передаешь FINDREPLACE, через SendMesage или PostMessage. если PostMessage, то проследи, чтобы твой объект существовал в памяти в момент обработки мессаг. к примеру такое может вызвать ошибку :

FINDREPLACE find;
..................
::PostMessage(hWnd, WM_FINDMESSAGE, 0, (LPARAM)&find);

когда мессага дойдет, от структуры может и ничего не остаться.

тут куча причин могут быть, пока в голову пришли только эти.
и еще не понял как это - "хотя половина элементов по адресу lprf содержат верные значения" - а другая половина где пропадает? и что содержит поле Flags до отправки сообщения и в момент получения? по моему, все таки, если "половина" теряеться по дороге, то твоя структура FINDREPLACE высвобождаеться из памяти и ты получаешь какой то непонятный мусор.
[Win32] Find Common Dialog 08.06.01 03:26  
Автор: LBH Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> тут сразу фиг поймешь. я не понял - lpfr->lpstrFindWhat
> вообще пуст, или MessageBox не выводит на экран?
пуст, смотрел через watch

> и еще, если ты пишешь через АПИ, то MessageBox - у тебя
> какой АПИшный или МФСишный?
mfc'шный, имхо практически одинаковые

> еще через что ты передаешь FINDREPLACE, через SendMesage
> или PostMessage. если PostMessage, то проследи, чтобы твой
ловлю сообщение в WindowProc MFC'шном

> объект существовал в памяти в момент обработки мессаг. к
> примеру такое может вызвать ошибку :
нет, там в lParam находится указатель на область памяти содержащую FINDREPLACE структуру,сл. выделять ничего не надо, если есть мсдн или платформсдк - глянь там, мож что увидишь чего я не увидел

>
> FINDREPLACE find;
> ..................
> ::PostMessage(hWnd, WM_FINDMESSAGE, 0, (LPARAM)&find);
>
> когда мессага дойдет, от структуры может и ничего не
> остаться.
>
> тут куча причин могут быть, пока в голову пришли только
> эти.
> и еще не понял как это - "хотя половина элементов по адресу
> lprf содержат верные значения" - а другая половина где
размер структуры верный, размер поля lpstrFindWhat верный (там отдельная переменная за это отвечает), адрес в памяти тоже верный, а текста нету

> пропадает? и что содержит поле Flags до отправки сообщения
> и в момент получения? по моему, все таки, если "половина"
> теряеться по дороге, то твоя структура FINDREPLACE
> высвобождаеться из памяти и ты получаешь какой то
> непонятный мусор.



void CLBHMoneyAccountDlg::OnFind()
{
WM_FINDMESSAGE=RegisterWindowMessage(FINDMSGSTRING);

ZeroMemory(&FindReplace,sizeof(FindReplace));
FindReplace.lStructSize=sizeof(FindReplace);
FindReplace.lpstrFindWhat = "";
FindReplace.wFindWhatLen=80;

FindReplace.Flags=FR_NOMATCHCASE|FR_NOWHOLEWORD;
FindReplace.hwndOwner=this->GetSafeHwnd();

FRWin.m_hWnd = FindText(&FindReplace);

}


LRESULT CLBHMoneyAccountDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{

if(message==WM_FINDMESSAGE)
{

LPFINDREPLACE lpfr= (LPFINDREPLACE)lParam;

if (lpfr->Flags & FR_FINDNEXT)
{
MessageBox(FindReplace.lpstrFindWhat);
}
}
else return CDialog::WindowProc(message, wParam, lParam);

return NULL;
}
[Win32] Find Common Dialog 08.06.01 04:07  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>

посмотри сообщение +-а, он правильный вопрос задал.
вот где ошибка
lpstrFindWhat
Pointer to a buffer that a FINDMSGSTRING message uses to pass the null terminated search string that the user typed in the Find What edit control. You must dynamically allocate the buffer or use a global or static array so it does not go out of scope before the dialog box closes. The buffer should be at least 80 characters long. If the buffer contains a string when you initialize the dialog box, the string is displayed in the Find What edit control.

т.е. надо хотя бы :
static TCHAR szFind[80];
szFind[0] = '\0';
> FindReplace.lpstrFindWhat = szFind;
> FindReplace.wFindWhatLen=sizeof(szFind);

удачи.
[Win32] Find Common Dialog 08.06.01 04:02  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
smotri ^^^^^^

> void CLBHMoneyAccountDlg::OnFind()
> {
>
> WM_FINDMESSAGE=RegisterWindowMessage(FINDMSGSTRING);
>
> ZeroMemory(&FindReplace,sizeof(FindReplace));
> FindReplace.lStructSize=sizeof(FindReplace);
> FindReplace.lpstrFindWhat = "";
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ty dolzhen alocirovat` pamiat` sdes`, I zhe tebe uzhe napisal
FindReplace.lpstrFindWhat = new char[80];
//potom ne zabud` delete []FindReplace.lpstrFindWhat;

> FindReplace.wFindWhatLen=80;
>
> FindReplace.Flags=FR_NOMATCHCASE|FR_NOWHOLEWORD;
> FindReplace.hwndOwner=this->GetSafeHwnd();
>
> FRWin.m_hWnd = FindText(&FindReplace);
>
> }
>
[Win32] Find Common Dialog 08.06.01 04:08  
Автор: LBH Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > FindReplace.lStructSize=sizeof(FindReplace);
> > FindReplace.lpstrFindWhat = "";
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> ty dolzhen alocirovat` pamiat` sdes`, I zhe tebe uzhe
> napisal
> FindReplace.lpstrFindWhat = new char[80];
> //potom ne zabud` delete []FindReplace.lpstrFindWhat;

спасибо; теперь я понял окончательно как работают common диалоги=)
[Win32] Find Common Dialog 08.06.01 03:03  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
Did you dynamically allocate memory for "lpfr->lpstrFindWhat"?
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2021 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach