【问题标题】:CPrintDialog Creation Failing in Service Mode of an Application在应用程序的服务模式下创建 CPrintDialog 失败
【发布时间】:2014-04-22 06:18:01
【问题描述】:

我有一个自动打印报告的应用程序。我正在使用 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 创建失败。

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

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

【问题讨论】:

    标签: printing mfc visual-c++-6


    【解决方案1】:

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

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

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

    为此,只需直接调用CreateDC,指定"WINSPOOL" 作为设备和打印机的名称。您可以通过使用EnumPrinters 函数枚举已安装的打印机来获取所需打印机的名称。这一切都方便地记录在操作方法文章中:Retrieve a Printer Device Context

    【讨论】:

    • 谢谢@Cody Gray :) 但是我可以在 VC6 中使用 GetDefaultPrinter()
    • @jmaniac GetDefaultPrinter 检索当前用户的默认打印机的打印机名称。如果您从服务运行,则没有当前用户。您可能可以将它与 VC6 一起使用,但您永远不能从服务中使用它。
    • 您使用的可能是一个非常旧的 Windows 版本,该版本早于 Windows Vista 实施的安全架构更改,您运行的是旧版本的 Windows 只是一个巧合旧版本 Windows 上的 Visual C++。 (虽然这并不能解释一切。即使在 NT 的早期版本中,当没有用户登录时,也没有当前用户,这使得该功能毫无意义。所以它可能只是似乎工作,因为当你测试它时你已经登录了。)
    • 感谢 Cody Gray.. 所以我无法通过 EnumPrinters() 以及您在将其作为服务运行时提到的逻辑来获取默认打印机。对吗?
    猜你喜欢
    • 1970-01-01
    • 2014-01-11
    • 2020-09-21
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多