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窗口显示出来还是无法启动打印任务。一直想不明白是哪出问题了,不知从何下手。
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"勾上。
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窗口显示出来还是无法启动打印任务。一直想不明白是哪出问题了,不知从何下手。
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"勾上。
2、在你的服务属性选项卡里,把"Allw service to interact with desktop"勾上。
#6
服务用CreateProcessAsUser模拟当前用户方式启动打印.不要用service权限去启动
#7
我是和同学讨论后才解决的,方法和6楼oyljerry方法一样,oyljerry早点说就好了,至少昨晚我可以睡的安稳点。我查了下,当printer在system用户下无法启动打印,我让printer在administrator用启下可以打印。
#8
5楼兄弟的方法没试,不知道可不可行...不过还是要谢谢大家帮助的。
#9
5楼方法的可以