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

时间:2014-04-22 06:18:01

标签: printing mfc vc6

我有一个自动打印报告的应用程序。我正在使用CPrintDialog来获取打印机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
    */
}

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

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

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

注意:应用程序的设计方式是在安装中作为服务运行。

1 个答案:

答案 0 :(得分:4)

  

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

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

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

为此,请直接致电CreateDC,将"WINSPOOL"指定为设备和打印机名称。您可以通过使用EnumPrinters功能枚举已安装的打印机来获取所需打印机的名称。这些都可以方便地记录在how-to文章中:Retrieve a Printer Device Context