【发布时间】:2009-03-25 01:50:52
【问题描述】:
我有一个旧应用程序需要以横向模式打印。我找到的文档说要获得一个 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(实际上是无符号等价物),表示出现错误情况。这在 Debug 和 Release 模式下都会发生(我在网上看到的一份报告在 Debug 中遇到了这个问题,但在 Release 中没有)。 printer_name.get() 是有效的,但我不知道如何在调试器中检查 hWnd 或 printer_handle_pointer 的正确性。
所以,如果有人能告诉我我做错了什么,或者如何更好地诊断它,或者如何判断句柄是否有效并指向有效信息,我将不胜感激。
我在 Vista Business SP1 上使用 VS 2008SP1,如果这有什么不同的话。原始应用是在某些版本的 XP 上使用早期版本的 VS 编写的。
【问题讨论】:
标签: winapi visual-c++ printing