У меня есть старое приложение, которое мне нужно распечатать в альбомном режиме. В документации, которую я нашел, написано, чтобы получить структуру 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.