У меня есть старое приложение, которое мне нужно для печати в ландшафтном режиме. В документации, которую я нашел, говорится, что нужно получить структуру DEVMODE, изменить пару полей и вернуть ее обратно. Что у меня есть:
HANDLE printer_handle;
LPHANDLE printer_handle_pointer(&printer_handle);
OpenPrinter(printer_name.get(), printer_handle_pointer, NULL);
size_t devmode_size = DocumentProperties(hWnd, printer_handle_pointer, printer_name.get(), NULL, NULL, 0);
DEVMODE * devmode = reinterpret_cast<DEVMODE *>(new char[devmode_size]);
DocumentProperties(NULL, printer_handle_pointer, printer_name.get(), devmode, NULL, DM_OUT_BUFFER);
devmode->dmSize = sizeof( DEVMODE);
devmode->dmFields |= DM_ORIENTATION;
devmode->dmOrientation = DMORIENT_LANDSCAPE;
DocumentProperties(NULL, printer_handle_pointer, printer_name.get(), devmode, devmode, DM_IN_BUFFER | DM_OUT_BUFFER);
hdcPrint = CreateDC(NULL, printer_name.get(), NULL, devmode);
Моя текущая проблема заключается в том, что первый DocumentProperties (тот, который возвращает размер структуры DEVMODE) возвращает -1 (на самом деле эквивалент без знака), что означает состояние ошибки. Это происходит как в режиме отладки, так и в режиме выпуска (в одном отчете, который я видел в Интернете, эта проблема была в режиме отладки, но не в режиме выпуска). printer_name.get()
действителен, но я не знаю, как проверить правильность hWnd
или printer_handle_pointer
в отладчике.
Итак, я бы хотел, чтобы кто-нибудь сказал мне, что я делаю неправильно, или как лучше это диагностировать, или как определить, действительны ли дескрипторы и указывают ли они на достоверную информацию, я был бы признателен.
Я использую VS 2008SP1 на Vista Business SP1, если это имеет значение. Исходное приложение было написано с более ранней версией VS на какой-то версии XP.