问题描述
各位大神,请问如何用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);}