在应用程序的服务模式下创建 CPrintDialog 失败

2022-01-12 00:00:00 printing mfc visual-c++-6

我有一个自动打印报告的应用程序.我正在使用 CPrintDialog 来获取打印机 DC.

I have an application that prints the report automatically. I am using CPrintDialog to get the Printer DC.

void CMyClass::PrintReport()
{
    CDC dc;
    CPrintDialog printDlg(FALSE);
    printDlg.GetDefaults ();
    ::DeleteDC( printDlg.m_pd.hDC );
    LPDEVMODE pDevMode = printDlg.GetDevMode();
    if(pDevMode)
    {
        pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
        ::GlobalUnlock(pDevMode);
    }
    HDC hDC;
    if( (hDC = printDlg.CreatePrinterDC()) == NULL )
    {
        ::GlobalFree( printDlg.m_pd.hDevMode );
        ::GlobalFree( printDlg.m_pd.hDevNames );
        return;
    }
    ::GlobalFree( printDlg.m_pd.hDevMode );
    ::GlobalFree( printDlg.m_pd.hDevNames );
    dc.Attach(hDC);         // Attach a printer DC
    dc.m_bPrinting = TRUE;
    dc.SetMapMode(MM_LOENGLISH);
    /* 

        Printing Logic using dc
    */
}

当我在调试模式下运行我的应用程序时,这工作正常,这是一个控制台应用程序.

This works fine when I run my application in the Debug mode which comes a a Console application.

但是,当我将应用程序作为 Windows 服务运行时,CPrintDialog 创建失败.

But, the CPrintDialog creation is failing when I run the application as a Windows Service.

我做错了吗?:(请帮帮我.

Am I doing anything wrong? :( Please help me.

注意:应用程序设计为在安装中作为服务运行.

Note: The Application is designed in a way to run as a Service in the Installation.

推荐答案

当我将应用程序作为 Windows 服务运行时,CPrintDialog 创建失败.

the CPrintDialog creation is failing when I run the application as a Windows Service.

您不能在 Windows 服务中显示对话框(或任何类型的用户界面).所以 CPrintDialog 永远不会起作用.

You cannot display dialogs (or any type of user interface) in a Windows Service. So CPrintDialog is never going to work.

但您不需要创建对话框来获取打印机设备上下文,假设您已经知道要打印到哪台打印机.由于您作为非交互式服务运行,您必须已经知道这一点,因为用户无法选择打印机.

But you don't need to create a dialog to get a printer device context, assuming that you already know which printer you want to print to. And since you're running as a non-interactive service, you must already know this, because there's no way that the user can choose a printer.

为此,只需调用 CreateDC 直接指定 "WINSPOOL" 作为设备和打印机的名称.您可以通过使用 EnumPrinters 函数.这一切都方便地记录在操作方法文章中:检索打印机设备上下文.

To do so, just call CreateDC directly, specifying "WINSPOOL" as the device and the name of the printer. You can obtain the name of the desired printer by enumerating the installed printers using the EnumPrinters function. This is all conveniently documented in a how-to article: Retrieve a Printer Device Context.

相关文章