Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.

Visual C++. MFC
Урок 25. Передаем данные по ссылке

В уроке 19 мы с вами посмотрели, как передаются данные в диалоговое окно и из него. Напомним приблизительную схему - заводим пару переменных (одну в классе диалогового окна и другую, наример, в классе гланого окна). После этого вызываем диалог с помощью DoModal, передавая данные перед и после этого вызова:

    ...
 
     CSomeDlg dlg;
 
     dlg.m_SomeData=m_SomeData;
 
     dlg.DoModal();
 
     m_SomeData=dlg.m_SomeData;
 
     ...

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

Создайте проект основанный на диалоговом окне. Для этого проще всего воспользоваться AppWizard'ом (для создания EXE):

Содание нового проекта

На первом шаге мастера в качестве типа приложения выберите тип Single Document, и уберите галочку для поддержки архитектуры Документ-Вид (зачем нам разные усложнения):

Выбор типа проекта

Далее до шага 4 оставляем все параметры по умолчанию. На шаге 4 уберите лишние галочки для панели инструментов и для строки состояния (Docking toolbar и Initial status bar), после чего можно сразу нажать на Finish.

После создания заготовки переходим к содержательной части нашего кода.

Создаем ресурс для нового диалогового окна. Для этого нажимаем Ctrl+R, выбираем среди ресурсов Dialog, нажимаем на кнопочку New. В редакторе диалога добавьте на него Edit:

Редактор диалога

Вызываем далее ClassWizard (Ctrl+W), в появившемся диалоговом окне выбираем радиокнопку Создать новый класс:

Создание нового класса

В качестве имени класса задаем CDlg, после чего закрываем окошко New Class и ClassWizard. Далее с помощью редактора меню добавляем новое меню (назовем его Dialog и добавим в меню File), и в его обработчик (созданный с помощью ClassWizard) вставляем следующий код:

void CMainFrame::OnFileDialog()
 
 {
 
     // TODO: Add your command handler code here
 
     CDlg dlg(this);
 
     dlg.DoModal();
 
 }

Не забудьте в начале этого файла добавить нужный include, чтобы компилятор не ругался, что он не знает, что такое CDlg:

...
 
 #include "Dlg.h"
 
 #include "MainFrm.h"
 
 ...

Обратите внимание, что это весь необходимый код для передачи данных в диалоговое окно и из него. Мы ничего не передаем ни до вызова DoModal(), ни после него. Также обратите внимание, что мы конструируем экземпляр нашего класса CDlg с параметром this. Тем самым мы передаем в dlg указатель на класс окна-рамки. Разумеется такой конструктор с параметром типа CMainFrame * должен существовать в классе CDlg. Добавьте его. Его реализация будет такой:

CDlg::CDlg(CMainFrame *pMainFrame):CDialog (IDD_DIALOG1, pMainFrame)
 
 {
 
     m_pMainFrame=pMainFrame;
 
 }

Обратите внимание, что для данного конструктора мы вызываем в том числе и конструктор базового класса CDialog.

Так как наш конструктор использует указатель на родительский класс, то его надо добавить (в заголовочный файл класса CDlg, разумеется):

...
 
 #include "MainFrm.h" //Надо подключить
 
 ...
 
 class CDlg : public CDialog
 
 {
 
     ...
 
 public:
 
     CDlg (CMainFrame* pMainFrame);
 
     CDlg(CWnd* pParent = NULL);   // standard constructor
 
     CMainFrame *m_pMainFrame;// Указатель на главное окно приложения
 
     ...

Теперь займемся данными. Добавьте в класс окна-рамки CMainFrame следующую переменную (в ней как раз и хранится большой объем данных, для которых мы не хотим делать копии в классе CDlg):

    ...
 
 public:
 
     CString m_sBigData;
 
     ...

В конструкторе класса CMainFrame что-нибудь запишите в эту переменную:

CMainFrame::CMainFrame()
 
 {
 
     // TODO: add member initialization code here
 
     m_sBigData="Большие данные";
 
 }

Теперь займемся непосредственно обменом. Для этого добавьте в метод DoDataExchange класса CDlg вызов DDX_Text(...):

void CDlg::DoDataExchange(CDataExchange* pDX)
 
 {
 
     CDialog::DoDataExchange(pDX);
 
     //{{AFX_DATA_MAP(CDlg)
 
         // NOTE: the ClassWizard will add DDX and DDV calls here
 
     //}}AFX_DATA_MAP
 
     DDX_Text(pDX, IDC_EDIT1, m_pMainFrame->m_sBigData);
 
 }

Что мы тут делаем? Мы осуществляем обмен между полем IDC_EDIT1 и переменной m_sBigData из класса окна-рамки, на которую указывает m_pMainFrame.

Запускайте программу и заходите в наше меню. В edit'е появится строка, взятая из окна рамки:

Диалоговое окно со старым значением

Если в нем напечатать что-нибудь другое, нажать на OK и затем вновь вызвать наше диалоговое окно, то будет уже новое значение:

Диалоговое окно с новым значением

Таким образом наша ссылка работает!



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS