Я отображаю диалоговое окно CPrintDialogEx, чтобы выбрать принтер и изменить настройки.Я установил член hDevNames так, чтобы был выбран принтер по умолчанию, но я оставил для hDevMode значение NULL.При успешном возврате я извлекаю некоторые значения, такие как размер бумаги, из возвращенной структуры DEVMODE из hDevMode.
У меня проблема, потому что кажется, что hDevMode инициализируется значениями из принтера по умолчанию, который я передал,не тот принтер, который был окончательно выбран.Как я могу получить параметры от фактического выбранного принтера?
В соответствии с запросом приведена соответствующая часть кода.Я удалил некоторые из них в интересах космоса.TOwnedHandle - это умный указатель, который я написал для удержания маркера памяти и его автоматической блокировки.
CPrintDialogEx dlg(PD_ALLPAGES | PD_NOCURRENTPAGE | PD_NOPAGENUMS | PD_NOSELECTION, this);
ASSERT(dlg.m_pdex.hDevMode == NULL);
ASSERT(dlg.m_pdex.hDevNames == NULL);
dlg.m_pdex.hDevNames = GlobalAlloc(GHND, sizeof(DEVNAMES) + iSizeName);
DEVNAMES * pDevNames = (DEVNAMES *) GlobalLock(dlg.m_pdex.hDevNames);
// ...
GlobalUnlock(dlg.m_pdex.hDevNames);
if ((dlg.DoModal() == S_OK) && (dlg.m_pdex.dwResultAction == PD_RESULT_PRINT))
{
TOwnedHandle<DEVMODE> pDevMode = dlg.m_pdex.hDevMode;
TRACE("Printer config = %dx%d %d\n", (int)pDevMode->dmPaperWidth, (int)pDevMode->dmPaperLength, (int)pDevMode->dmOrientation);
// ...
}
Редактировать: Я решил, что проблема не возникает, еслиЯ не устанавливаю параметр hDevNames.Интересно, обнаружил ли я ошибку Windows?Это в XP, у меня нет более поздней версии Windows, удобной для тестирования.
Я перевел код в тест, который не использует MFC, это строго проблема Windows API,Это все, ничего не пропущено, кроме определения pDefaultPrinter - но, конечно, он больше не делает ничего полезного.
PRINTDLGEX ex = {sizeof(PRINTDLGEX)};
ex.hwndOwner = m_hWnd;
ex.Flags = PD_ALLPAGES | PD_NOCURRENTPAGE | PD_NOPAGENUMS | PD_NOSELECTION;
ex.nStartPage = START_PAGE_GENERAL;
#if 1
int iSizeName = (strlen(pDefaultPrinter) + 1) * sizeof(char);
ex.hDevNames = GlobalAlloc(GHND, sizeof(DEVNAMES) + iSizeName);
DEVNAMES * pDevNames = (DEVNAMES *) GlobalLock(ex.hDevNames);
ASSERT(pDevNames != NULL);
pDevNames->wDeviceOffset = sizeof(DEVNAMES);
strcpy((char *)pDevNames + pDevNames->wDeviceOffset, pDefaultPrinter);
GlobalUnlock(ex.hDevNames);
#endif
HRESULT hr = PrintDlgEx(&ex);
if ((hr == S_OK) && (ex.dwResultAction == PD_RESULT_PRINT))
{
DEVMODE * pdm = (DEVMODE *) GlobalLock(ex.hDevMode);
ASSERT(pdm != NULL);
TRACE("Printer config = %dx%d %d\n", (int)pdm->dmPaperWidth, (int)pdm->dmPaperLength, (int)pdm->dmOrientation);
GlobalUnlock(ex.hDevMode);
DEVNAMES * pdn = (DEVNAMES *) GlobalLock(ex.hDevNames);
ASSERT(pdn != NULL);
TRACE(_T("Printer device = %s\n"), (char *)pdn + pdn->wDeviceOffset);
GlobalUnlock(ex.hDevNames);
}
Если я не могу получить исправление, я бы с удовольствиемуслышать об обходном пути.