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

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


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

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



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.

Как получить текущие настройки принтера в MFC

Единственный способ, получить доступ к текущим настройкам принтеров, это через структуры m_hDevMode и m_hDevNames хранящимися в CWinApp. Эти члены доступны через структуру PRINTDLG, указатель которой передаётся в функцию-член GetPrinterDeviceDefaults() класса, наследованного от CWinApp. Так как возвращаемые значения hDevMode и hDevNames являются переменными HGLOBAL, то для того, чтобы вернуть указатель на структуры необходимо вызывать ::GlobalLock(). Используя данный указатель, можно извлечь информацию из структуры, чтобы определить текущее состояние принтера. Более подробно о содержимом этих структур можно посмотреть DEVMODE и DEVNAMES в хелпе по SDK.

Нижеприведённый пример является функцией-членом класса, наследованного от CView, которая возвращает текущий размер страницы принтера используя GetDeviceCaps() на объекте CDC, созданного с установками принтера:

Пример кода

   /* Необходимые опции компилятора: нет
    */
 
       BOOL CMyView::GetPageSize(CSize &nRetVal)
       {
          PRINTDLG FAR * pPrintDlg = new PRINTDLG;
          BOOL bRet = FALSE;
 
       // Получаем текущие установки принтера.
 
          if(AfxGetApp()->GetPrinterDeviceDefaults(pPrintDlg))
          {
 
       // Получаем указатели на две структуры с установками.
 
             DEVNAMES FAR *lpDevNames =
             (DEVNAMES FAR *)::GlobalLock(pPrintDlg->hDevNames);
 
             DEVMODE FAR *lpDevMode =
             (DEVMODE FAR *)::GlobalLock(pPrintDlg->hDevMode);
 
       // Получаем информацию о драйвере.
 
             CString szDriver((LPTSTR)lpDevNames +
                                  lpDevNames->wDriverOffset);
             CString szDevice((LPTSTR)lpDevNames +
                                  lpDevNames->wDeviceOffset);
             CString szOutput((LPTSTR)lpDevNames +
                                  lpDevNames->wOutputOffset);
 
       // Создаём объект CDC согласно текущим настройкам.
 
             CDC pDC;
             pDC.CreateDC(szDriver, szDevice, szOutput, lpDevMode);
 
       // Запрашиваем у объекта CDC ширину и высоту текущей страницы.
 
             nRetVal.cx = pDC.GetDeviceCaps(HORZSIZE);
             nRetVal.cy = pDC.GetDeviceCaps(VERTSIZE);
 
       // Избавляемся от объекта CDC.
 
             pDC.DeleteDC();
 
       // Разблокируем указатели на структуры настроек.
 
             ::GlobalUnlock(pPrintDlg->hDevNames);
             ::GlobalUnlock(pPrintDlg->hDevMode);
 
           bRet = TRUE;
          }
        delete pPrintDlg;
        return bRet;
    } 

 

 





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

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




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



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


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