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

Printing CPrintDialog创建在应用程序的服务模式下失败,printing,mfc,visual-c++-6,Printing,Mfc,Visual C++ 6,我有一个自动打印报告的应用程序。我正在使用CPrintDialog获取打印机DC void CMyClass::PrintReport() { CDC dc; CPrintDialog printDlg(FALSE); printDlg.GetDefaults (); ::DeleteDC( printDlg.m_pd.hDC ); LPDEVMODE pDevMode = printDlg.GetDevMode(); if(pDevMode)

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

我做错什么了吗请帮帮我

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

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

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

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

为此,只需直接调用,将WINSPOOL指定为设备和打印机名称。通过使用函数枚举已安装的打印机,可以获得所需打印机的名称。所有这些都方便地记录在一篇操作文章中:

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

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

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


为此,只需直接调用,将WINSPOOL指定为设备和打印机名称。通过使用函数枚举已安装的打印机,可以获得所需打印机的名称。所有这些都方便地记录在一篇操作文章中:。

谢谢@Cody Gray:但是我可以在中使用GetDefaultPrinter吗VC6@jmaniacGetDefaultPrinter检索当前用户的默认打印机的打印机名称。如果您是从服务运行,则没有当前用户。您可能可以使用它与VC6,但您不能使用它从一个服务。您可能使用它是一个非常旧的版本的Windows,一个以前的安全体系结构的变化与Windows Vista实现,这只是巧合,你运行一个旧版本的Visual C++在旧版本的Windows。虽然这并不能解释一切。即使在NT的早期版本中,当没有用户登录时,也没有当前用户,这使得该功能毫无意义。所以它可能只是看起来有效,因为当你测试它时,你已经登录了。谢谢Cody Gray。。因此,我无法通过EnumPrinters和您在作为服务运行时提到的逻辑获得默认打印机。对吗?谢谢@Cody Gray:但是我可以在中使用GetDefaultPrinter吗VC6@jmaniacGetDefaultPrinter检索当前用户的默认打印机的打印机名称。如果您是从服务运行,则没有当前用户。您可能可以使用它与VC6,但您不能使用它从一个服务。您可能使用它是一个非常旧的版本的Windows,一个以前的安全体系结构的变化与Windows Vista实现,这只是巧合,你运行一个旧版本的Visual C++在旧版本的Windows。虽然这并不能解释一切。即使在NT的早期版本中,当没有用户登录时,也没有当前用户,这使得该功能毫无意义。所以它可能只是看起来有效,因为当你测试它时,你已经登录了。谢谢Cody Gray。。因此,我无法通过EnumPrinters和您在作为服务运行时提到的逻辑获得默认打印机。正当