информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаСтрашный баг в WindowsГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор 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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach