windows服务程序调用printer打印程序 无法启动打印任务,何解?

时间:2022-09-22 17:09:23
我用windows应用程序调用printer打印程序可以正常打印,但用windows服务程序调用printer却无法启动打印任务无法打印,头痛了一个星期还是无解,各位高人帮帮忙!谢谢。。。。

9 个解决方案

#1


windows应用程序 是控制台类型还是窗口类型?
如果为窗口类型,那么跟服务是有区别的

#2


服务程序是不能有窗口的。监视下要使用的API,然后动态LoadLibraryA->GetProcAddress这样的调用。也许可以解决问题。

#3


服务程序及应用程序调用打印程序都使用以下代码:
string sCommandline = "d:\\imodia\\bin\\printer.exe";
string sWorkDir = sCommandline.substr(0, sCommandline.rfind("\\"));
char pCommandLine[128] = {0};
strcpy(pCommandLine, sCommandline.c_str());

PROCESS_INFORMATION pProcInfo; 
STARTUPINFO startUpInfo = {sizeof(STARTUPINFO),NULL,"",    NULL,0,0,0,0,0,0,0,STARTF_USESHOWWINDOW,0,0,NULL,0,0,0};  
startUpInfo.wShowWindow = SW_SHOW;
startUpInfo.lpDesktop = NULL;

CreateProcess(NULL,pCommandLine, NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,sWorkDir.c_str(),&startUpInfo,&pProcInfo);

启动打印任务的代码:
AfxGetApp()->CreatePrinterDC(m_dc);
DOCINFO di;
ZeroMemory(&di,sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "printer";
m_iTotalLine = 0;
if(m_dc.StartDoc(&di))
{
     m_dc.StartPage();
     return TRUE;
}

初以为是因为服务程序调用printer程序没有显示出窗口,后把printer窗口显示出来还是无法启动打印任务。一直想不明白是哪出问题了,不知从何下手。

#4


无法启动打印任务是因为m_dc.StartDoc(&di)调用不起作用,一是StartDoc僵死出不来,二是StartDoc通过了,但打印任务没起来。

#5


1、确保Print Spooler服务已启动;
2、在你的服务属性选项卡里,把"Allw service to interact with desktop"勾上。

#6


服务用CreateProcessAsUser模拟当前用户方式启动打印.不要用service权限去启动

#7


我是和同学讨论后才解决的,方法和6楼oyljerry方法一样,oyljerry早点说就好了,至少昨晚我可以睡的安稳点。我查了下,当printer在system用户下无法启动打印,我让printer在administrator用启下可以打印。

#8


5楼兄弟的方法没试,不知道可不可行...不过还是要谢谢大家帮助的。

#9


5楼方法的可以

#1


windows应用程序 是控制台类型还是窗口类型?
如果为窗口类型,那么跟服务是有区别的

#2


服务程序是不能有窗口的。监视下要使用的API,然后动态LoadLibraryA->GetProcAddress这样的调用。也许可以解决问题。

#3


服务程序及应用程序调用打印程序都使用以下代码:
string sCommandline = "d:\\imodia\\bin\\printer.exe";
string sWorkDir = sCommandline.substr(0, sCommandline.rfind("\\"));
char pCommandLine[128] = {0};
strcpy(pCommandLine, sCommandline.c_str());

PROCESS_INFORMATION pProcInfo; 
STARTUPINFO startUpInfo = {sizeof(STARTUPINFO),NULL,"",    NULL,0,0,0,0,0,0,0,STARTF_USESHOWWINDOW,0,0,NULL,0,0,0};  
startUpInfo.wShowWindow = SW_SHOW;
startUpInfo.lpDesktop = NULL;

CreateProcess(NULL,pCommandLine, NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,sWorkDir.c_str(),&startUpInfo,&pProcInfo);

启动打印任务的代码:
AfxGetApp()->CreatePrinterDC(m_dc);
DOCINFO di;
ZeroMemory(&di,sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "printer";
m_iTotalLine = 0;
if(m_dc.StartDoc(&di))
{
     m_dc.StartPage();
     return TRUE;
}

初以为是因为服务程序调用printer程序没有显示出窗口,后把printer窗口显示出来还是无法启动打印任务。一直想不明白是哪出问题了,不知从何下手。

#4


无法启动打印任务是因为m_dc.StartDoc(&di)调用不起作用,一是StartDoc僵死出不来,二是StartDoc通过了,但打印任务没起来。

#5


1、确保Print Spooler服务已启动;
2、在你的服务属性选项卡里,把"Allw service to interact with desktop"勾上。

#6


服务用CreateProcessAsUser模拟当前用户方式启动打印.不要用service权限去启动

#7


我是和同学讨论后才解决的,方法和6楼oyljerry方法一样,oyljerry早点说就好了,至少昨晚我可以睡的安稳点。我查了下,当printer在system用户下无法启动打印,我让printer在administrator用启下可以打印。

#8


5楼兄弟的方法没试,不知道可不可行...不过还是要谢谢大家帮助的。

#9


5楼方法的可以