求助,如何自动加载打印机驱动

问题描述

各位大神,请问如何用AddPrinterDriver加载打印机驱动,网上下了些代码,稍做修改(如下),但执行到AddPrinterDriver时,就报"系统资源不足,无法完成请求的服务",琢磨了好久,也看不出所以然,故请大神指教以下在WIN10环境下运行,用VC6.0编译//Setup.cpp:Definestheentrypointfortheapplication.//#include"stdafx.h"//#include"Winspool.h"#include<stdlib.h>////////////////////////////////////////////////////////函数声明//BOOLMyPCopyFiles();BOOLMyPAddPort();BOOLMyPAddPrinterDriver();BOOLMyPAddPrinter();BOOLMyPDeletePrinter();BOOLMyPDeletePrinterDriver();BOOLMyPDeletePort();BOOLMyPDeleteFiles();voidShowErrorMessage(intnErrorCode);voidShowErrorMessage(LPCSTRlpszErrMsg);////////////////////////////////////////////////////////全局常量声明//constchargc_szEnvironment[]="WindowsNTx86";constchargc_szPrinterName[]="MyPrinter";constchargc_szDriverName[]="MyPrinter";constchargc_szPortName[]="MyPrinter:";constWCHARgc_wszPortName[]=L"MyPrinter:";constchargc_szDriverFile[]="cloud_print.dll";constchargc_szDataFile[]="cloud_print.gpd";constchargc_szConfigFile[]="cloud_printUI.dll";constchargc_szHelpFile[]="";constchar*gc_apszFiles[]={gc_szDriverFile,gc_szDataFile,gc_szConfigFile,gc_szHelpFile,"STDNAMES.GPD","UNIRES.DLL","cloud_print.ini","MSY.inf"};////////////////////////////////////////////////////////代码//intAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){charszInstallArg[]="/install";charszUninstallArg[]="/uninstall";//charszUninstallQuietArg[]="/uninstallquiet";strcpy(lpCmdLine,szInstallArg);if(0==_stricmp(lpCmdLine,szInstallArg)){//安装打印机驱动程序BOOLbResult=TRUE;bResult=bResult&&MyPCopyFiles();bResult=bResult&&MyPAddPort();bResult=bResult&&MyPAddPrinterDriver();bResult=bResult&&MyPAddPrinter();if(bResult)return0;elsereturn1;}elseif(0==_stricmp(lpCmdLine,szUninstallArg)){//卸载打印机驱动程序BOOLbResult=TRUE;bResult=bResult&&MyPDeletePrinter();bResult=bResult&&MyPDeletePrinterDriver();bResult=bResult&&MyPDeletePort();MyPDeleteFiles();if(bResult)return0;elsereturn1;}else{return2;}}////复制驱动程序文件到指定的文件夹。//BOOLMyPCopyFiles(){charszSrcDir[MAX_PATH]={0};charszDstDir[MAX_PATH]={0};charszSrcFilePath[MAX_PATH]={0};charszDstFilePath[MAX_PATH]={0};DWORDcbNeeded=0;if(0==GetModuleFileName(NULL,szSrcDir,sizeof(szSrcDir))){ShowErrorMessage("Can'tgetcurrentpath!");returnFALSE;}(*(strrchr(szSrcDir,'\')+1))='';if(!GetPrinterDriverDirectory(NULL,NULL,1,(LPBYTE)szDstDir,sizeof(szDstDir),&cbNeeded)){ShowErrorMessage("Can'tgetprinterdriverdirectory!");returnFALSE;}if('\'!=szDstDir[strlen(szDstDir)-1])strcat(szDstDir,"\");for(inti=0;i<sizeof(gc_apszFiles)/sizeof(gc_apszFiles[0]);i++){strcpy(szSrcFilePath,szSrcDir);strcat(szSrcFilePath,gc_apszFiles[i]);strcpy(szDstFilePath,szDstDir);strcat(szDstFilePath,gc_apszFiles[i]);CopyFile(szSrcFilePath,szDstFilePath,FALSE);if(-1==GetFileAttributes(szDstFilePath)){ShowErrorMessage("Failedtocopydriverfile!");returnFALSE;}}returnTRUE;}////添加打印机端口。//BOOLMyPAddPort(){HANDLEhXcv=INVALID_HANDLE_VALUE;PRINTER_DEFAULTSdef={NULL,NULL,SERVER_ACCESS_ADMINISTER};BYTEbyOutputData[256]={0};DWORDcbOutputNeeded=0;DWORDdwStatus=0;if(!OpenPrinter(",XcvMonitorLocalPort",&hXcv,&def))//if(!OpenPrinter(",XcvMonitorRedirectedPort",&hXcv,&def)){ShowErrorMessage(GetLastError());returnFALSE;}if(!XcvData(hXcv,L"AddPort",(PBYTE)gc_wszPortName,sizeof(gc_wszPortName),(PBYTE)byOutputData,sizeof(byOutputData),&cbOutputNeeded,&dwStatus)){ShowErrorMessage(dwStatus);ClosePrinter(hXcv);returnFALSE;}ClosePrinter(hXcv);returnTRUE;}////添加打印机驱动程序。//BOOLMyPAddPrinterDriver(){charszDriverDir[MAX_PATH]={0};chargc_szDriverFilePath[MAX_PATH]={0};chargc_szDataFilePath[MAX_PATH]={0};chargc_szConfigFilePath[MAX_PATH]={0};chargc_szHelpFilePath[MAX_PATH]={0};charszFiles[1024]={0};DWORDcbNeeded=0;DRIVER_INFO_3di3;if(!GetPrinterDriverDirectory(NULL,(char*)gc_szEnvironment,1,(LPBYTE)szDriverDir,sizeof(szDriverDir),&cbNeeded)){ShowErrorMessage("Can'tgetprinterdriverdirectory!");returnFALSE;}if('\'!=szDriverDir[strlen(szDriverDir)-1])strcat(szDriverDir,"\");strcpy(gc_szDriverFilePath,szDriverDir);strcat(gc_szDriverFilePath,gc_szDriverFile);strcpy(gc_szDataFilePath,szDriverDir);strcat(gc_szDataFilePath,gc_szDataFile);strcpy(gc_szConfigFilePath,szDriverDir);strcat(gc_szConfigFilePath,gc_szConfigFile);strcpy(gc_szHelpFilePath,szDriverDir);strcat(gc_szHelpFilePath,gc_szHelpFile);for(inti=0;i<sizeof(gc_apszFiles)/sizeof(gc_apszFiles[0]);i++){strcat(szFiles,gc_apszFiles[i]);strcat(szFiles,"n");}for(i=0;''!=szFiles[i];i++){if('n'==szFiles[i])szFiles[i]='';}ZeroMemory(&di3,sizeof(DRIVER_INFO_3));di3.cVersion=0x01;di3.pName=(char*)gc_szDriverName;di3.pEnvironment=(char*)gc_szEnvironment;di3.pDriverPath=gc_szDriverFilePath;di3.pDataFile=gc_szDataFilePath;di3.pConfigFile=gc_szConfigFilePath;di3.pHelpFile=gc_szHelpFilePath;di3.pDependentFiles=szFiles;di3.pMonitorName=NULL;di3.pDefaultDataType=NULL;if(!AddPrinterDriver(NULL,3,(LPBYTE)&di3)){ShowErrorMessage(GetLastError());returnFALSE;}returnTRUE;}////添加打印机。//BOOLMyPAddPrinter(){PRINTER_INFO_2pi2;ZeroMemory(&pi2,sizeof(PRINTER_INFO_2));pi2.pPrinterName=(char*)gc_szPrinterName;pi2.pDriverName=(char*)gc_szDriverName;pi2.pPortName=(char*)gc_szPortName;pi2.pPrintProcessor="WinPrint";if(NULL==AddPrinter(NULL,2,(LPBYTE)&pi2)){ShowErrorMessage(GetLastError());returnFALSE;}returnTRUE;}////删除打印机。//BOOLMyPDeletePrinter(){HANDLEhPrinter=INVALID_HANDLE_VALUE;PRINTER_DEFAULTSdef={NULL,NULL,PRINTER_ALL_ACCESS};if(!OpenPrinter((char*)gc_szPrinterName,&hPrinter,&def)){ShowErrorMessage(GetLastError());returnFALSE;}if(!DeletePrinter(hPrinter)){ShowErrorMessage(GetLastError());ClosePrinter(hPrinter);returnFALSE;}ClosePrinter(hPrinter);returnTRUE;}////删除打印机驱动程序。//BOOLMyPDeletePrinterDriver(){if(!DeletePrinterDriver(NULL,(char*)gc_szEnvironment,(char*)gc_szDriverName)){ShowErrorMessage(GetLastError());returnFALSE;}returnTRUE;}////删除打印机端口。//BOOLMyPDeletePort(){if(!DeletePort(NULL,NULL,(char*)gc_szPortName)){ShowErrorMessage(GetLastError());returnFALSE;}returnTRUE;}////删除打印机驱动程序的文件。//BOOLMyPDeleteFiles(){charszDstDir[MAX_PATH]={0};charszDstFilePath[MAX_PATH]={0};DWORDcbNeeded=0;inti=0;if(!GetPrinterDriverDirectory(NULL,(char*)gc_szEnvironment,1,(LPBYTE)szDstDir,sizeof(szDstDir),&cbNeeded))returnFALSE;if('\'!=szDstDir[strlen(szDstDir)-1])strcat(szDstDir,"\");for(i=0;i<sizeof(gc_apszFiles)/sizeof(gc_apszFiles[0]);i++){strcpy(szDstFilePath,szDstDir);strcat(szDstFilePath,gc_apszFiles[i]);DeleteFile(szDstFilePath);}charszIndex[10];charszSubFile[MAX_PATH]={0};//删除1-2-3目录下的文件for(intj=1;j<5;j++){itoa(j,szIndex,10);//MessageBox(NULL,szIndex,"DELETE",MB_OK);strcpy(szDstFilePath,szDstDir);strcat(szDstFilePath,szIndex);strcat(szDstFilePath,"\");for(i=0;i<sizeof(gc_apszFiles)/sizeof(gc_apszFiles[0]);i++){strcpy(szSubFile,szDstFilePath);if(0!=strcmp(gc_apszFiles[i],"UNIRES.DLL")&&0!=strcmp(gc_apszFiles[i],"STDNAMES.GPD"))//unires.dll保留吧{strcat(szSubFile,gc_apszFiles[i]);//MessageBox(NULL,szSubFile,"DELETE",MB_OK);DeleteFile(szSubFile);}}}returnTRUE;}////显示指定错误代码所代表的信息。//voidShowErrorMessage(intnErrorCode){LPTSTRlpMsgBuf;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,nErrorCode,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf,0,NULL);MessageBox(NULL,lpMsgBuf,"Error",MB_OK|MB_ICONERROR);LocalFree(lpMsgBuf);}////显示指定错误信息。//voidShowErrorMessage(LPCSTRlpszErrMsg){MessageBox(NULL,lpszErrMsg,"Error",MB_OK|MB_ICONERROR);}

时间: 2024-08-04 01:58:56

求助,如何自动加载打印机驱动的相关文章

linux下自动加载设备驱动程序模块

假设你的设备驱动程序为:yourdrivername.ko   1 cp yourdrivername.ko /lib/modules/"version"/kernel/drivers/misc   其中,version为linux的版本,默认为:2.6.23.1-42.fc8   2 编辑/lib/modules/"version"/modules.dep,设置驱动程序之间的关联,增加一行:   /lib/modules/"version"/k

电脑增加网络共享的打印机,提示驱动程序不正确,无法自动加载驱动

添加网络共享的打印机,提示驱动程序不正确,无法自动加载驱动(正常情况下,使用电脑共享的打印机驱动应为自动安装) 原因分析: 这是由于提供共享打印机的电脑,与添加网络打印机的电脑操作系统类型不一致导致(一台32位,另一台64位)造成的. 解决方案:方法一点击确定后,使用打印机驱动光盘(或文件)安装适合对应系统的驱动(此方法需要在每个系统类型不同的机器上分别安装,对于公司电脑较多的环境工作量较大). 方法二在提供共享打印机的电脑(服务端)上,将不同类型系统的驱动均加载进去(此方法一劳永逸,不同类型系

C118 免按开机自动加载固件

最近无事,研究了按按钮开机的功能:功能的起初是参考了别人的系统是怎么做免开机加载固件的. 一.原理: 1.c118 原生loader部分代码是没有源代码的,它上电只需要按开机键然后系统就会起来. 2.原生loader起来后,加载bb里面的loader .  BBloader就会接管系统所有的interrupt 3.只要控制bbloader reset系统,c118 就会跑原生的loader,然后linux端用oscomo后台执行加载固件的命令,系统就会自动加载固件: 二.需要解决的问题: 1.怎

解决:eth0网卡无法自动加载,网卡配置信息不在network-scripts中

 问题场景:eth0网卡无法自动加载,网卡配置信息不在network-scripts中 解决: 1>vi /etc/rc.d/rc.loacl  最后加入  ifup eth0 2>reboot 3>测试 换个ip,   service network restart   是否有效 或者桌面环境观察网卡状态是否在连接 4>ifconfig -a  查看 eth0信息是否改变 如果改变了,说明起效 此解决方案已通过本机测试通过,在你centos6.2以上的版本默认存在当物理ip改变之

php自动加载类

很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在一个PHP文件中,当在一个PHP文件中需要调用另一个文件中声明的类时,就需要通过include把这个文件引入.不过有的时候,在文件众多的项目中,要一一将所需类的文件都include进来,是一个很让人头疼的事,所以我们能不能在用到什么类的时候,再把这个类所在的php文件导入呢?这就是我们这里我们要讲的

ajax自动加载blogjava和博客园的rss

ajax|rss|博客|加载 自动加载blogjava和博客园的rss <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>

第十二节--类的自动加载 -- Classes and Objects in PHP5 [12]

object|php5|加载 | = 本文为Haohappy读<<Core PHP Programming>> | = 中Classes and Objects一章的笔记 | = 翻译为主+个人心得 | = 为避免可能发生的不必要的麻烦请勿转载,谢谢 | = 欢迎批评指正,希望和所有PHP爱好者共同进步! +-------------------------------------------------------------------------------+*/ 第十二节-

[JAVA100例]053、加载JDBC驱动

import java.sql.*; /** * <p>Title: JDBC连接数据库</p> * <p>Description: 本实例演示如何使用JDBC连接Oracle数据库,并演示添加数据和查询数据.</p> * <p>Copyright: Copyright (c) 2003</p> * <p>Filename: JDBCConn.java</p> * @version 1.0 */ public

Win8系统Flash插件无法自动加载怎么解决?

  Win8系统Flash插件无法自动加载怎么解决? 一.按住键盘Win+A+X键打开Windows命令提示符,然后在命令提示符窗口上输入cd C:WindowsSystem32MacromedFlash命令,再回车. 二.接着在命令提示符窗口上输入regsvr32 Flash.ocx命令,再回车.接着在命令提示符窗口上输入cd C:WindowsSysWOW64MacromedFlash命令. 三.然后在Win8系统命令提示符窗口中输入regsvr32 Flash.ocx命令,再回车,接着系统