chenfresh
驱动牛犊
驱动牛犊
  • 注册日期2002-10-23
  • 最后登录2004-06-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4481回复:13

卸载打印机驱动请教!

楼主#
更多 发布于:2003-10-20 17:00
我想用DeletePrinter()删除本地打印机列表中的一个打印机,用OpenPrinter()得到Printer的HANDLE,再调用DeletePrinter()。结果GetLastError() = 5(Access is denied),为什么?
请问我的方法对不对,如不对,请指教?

最新喜欢:

PreguntaPregun...
spin
驱动小牛
驱动小牛
  • 注册日期2001-04-17
  • 最后登录2015-10-27
  • 粉丝1
  • 关注0
  • 积分46分
  • 威望354点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-20 17:24
用OpenPrinter()得到Printer的HANDLE,后就不能删了
chenfresh
驱动牛犊
驱动牛犊
  • 注册日期2002-10-23
  • 最后登录2004-06-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-20 17:56
那请问如何得到Printer的HANDLE?
caesun
驱动小牛
驱动小牛
  • 注册日期2001-12-10
  • 最后登录2006-12-01
  • 粉丝0
  • 关注0
  • 积分290分
  • 威望30点
  • 贡献值393点
  • 好评度21点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-20 18:11
确认打印机没被使用。
然后加这个参数试试看PRINTER_ACCESS_ADMINISTER
chenfresh
驱动牛犊
驱动牛犊
  • 注册日期2002-10-23
  • 最后登录2004-06-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-10-21 08:59
使用参数PRINTER_ACCESS_ADMINISTER,用GetLastError()得到的是5,我用PRINTER_ALL_ACCESS,操作是成功的,但是GetLastError()得到的是183。不知道会存在什么不稳定的东西,有知道的,请赐教。
谢谢
Hellboy
驱动牛犊
驱动牛犊
  • 注册日期2003-07-22
  • 最后登录2005-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-10-22 13:11
WinExec(\"rundll32.exe printui.dll,PrintUIEntry /dl /n \"二printer name\"\",SW_SHOW);
chenfresh
驱动牛犊
驱动牛犊
  • 注册日期2002-10-23
  • 最后登录2004-06-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-10-23 09:31
楼上的网友,你写的我看不大懂,能解释一下吗?
hxy2003
驱动牛犊
驱动牛犊
  • 注册日期2003-07-17
  • 最后登录2007-10-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-10-28 17:09
如何安装打印机啊。。我用INF 和DLL
我用DDK改编的例子
Hellboy
驱动牛犊
驱动牛犊
  • 注册日期2003-07-22
  • 最后登录2005-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-11-13 15:03
如果是2000和xp,使用rundll32.exe printui.dll,PrintUIEntry 命令添加,删除打印机。
具体的使用说明可以在命令行运行 rundll32.exe printui.dll,PrintUIEntry /?
davy_yang
驱动牛犊
驱动牛犊
  • 注册日期2004-01-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-03-17 16:49
有些创建说用一个进程调用:"rundll32.exe printui.dll,PrintUIEntry /if /f I:\\printdriver\\Dragon.inf /r \"LPT1:\" /b \"DRoad USB Printer\" /m \"DRoad USB Printer\"", // Command line. 。可有些说可以用AddPrinterDriver后用AddPrinter安装。前者安装的缺点是inf所在的目录不好决定,请问你是如何控制的?卸载又如何做到呢?后者在installshield里你是如何做的?卸载时你有如何用DeletePrinter和DeletePrinterDriver的 ?还是写成dll调用呢?谢谢!!
davy_yang@163.com
houjun
驱动牛犊
驱动牛犊
  • 注册日期2003-12-21
  • 最后登录2004-11-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-03-27 22:10
不会啊,我就是用OpenPrinter - >DeletePrinter ->ClosePrinter
->DeletePrinterDriver的顺序删除的啊
Hellboy
驱动牛犊
驱动牛犊
  • 注册日期2003-07-22
  • 最后登录2005-06-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-03-30 10:15
我用VS.net做的安装包,把虚拟打印机当作一个项目安装到系统目录,然后调用一个自己写的EXE,用来调用rundll32安装打印机,卸载的时候,使用deleteprinter

prtdft.DesiredAccess = PRINTER_ALL_ACCESS;
SetLastError(0);
if(OpenPrinter("二维条码打印机",&hPrinter,&prtdft))
{
  DeletePrinter(hPrinter);
}
ClosePrinter(hPrinter);

"但是GetLastError()得到的是183。不知道会存在什么不稳定的东西"
可能是你在OpenPrinter前面没有SetLastError(0),得到的错误信息是前面的操作产生的
davy_yang
驱动牛犊
驱动牛犊
  • 注册日期2004-01-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-04-09 09:42
为什么2000和xp下一定要用rundll32么?我用了可以安装上去,也可以用rundll32来删除掉,可是安装好后再插拔usb打印机,系统总是提示说找到硬件,弹出来硬件安装向导,需要安装驱动。昏!!!我想2000下和xp下也用addprinter来安装可以么?你们是如何实现的呢?是不是还要在注册表里写东西呢?
Pointer to a null-terminated string that specifies the files the driver depends on. Each file name in the string is also terminated with a null (for example, Pscript.dll\\0Qms810.PPD\\0Pscrptui.dll\\0Pspcriptui.hlp\\0Pstest.txt\\0\\0). MSDN说这些字符串要紧凑的存储在内存里,每个文件都要用结束符来隔开,解决这个问题可以用下面的代码:
char *q = lpDependecy;
lstrcpy(q, _T("file1.dll"));
q += lstrlen(_T("file1.dll"))+1;

lstrcpy(q, _T("file2.gpd"));
q += lstrlen(_T("file2.gpd"))+1;

lstrcpy(q, _T("file3.ini"));
q += lstrlen(_T("file3.ini"))+1;

lstrcpy(q, _T("file4.dll"));
q += lstrlen(_T("file4.dll"))+1;

lstrcpy(q, _T("file5.inf"));
q += lstrlen(_T("file5.inf"))+1;
不过头疼的是,就算是这样,打印机还是不可以加上。不知道哪位高手可以赐教。我xp下的代码如下:请高手指点
PRINTER_INFO_2 pi2;
DRIVER_INFO_3 di3;
HANDLE hPrinter;

char* Environment=_TEXT("Windows NT x86");
char lpBuffer[MAX_PATH];

char lpDriverPath[MAX_PATH];
char lpDataFilePath[MAX_PATH];
char lpConfigFilePath[MAX_PATH];
char lpHelpFilePath[MAX_PATH];
char lpDependecy[MAX_PATH];

DWORD uSize=0;
CString str;
DWORD dwErr;
BOOL b;
char buffer[1024];

if (OpenPrinter("DRoad USB Printer",&hPrinter,NULL))
{
DeletePrinter(hPrinter);
ClosePrinter(hPrinter);
}
DeletePrinterDriver(NULL,"Windows NT x86","DRoad USB Printer");


GetPrinterDriverDirectory(NULL,Environment,1,(LPBYTE)lpBuffer,MAX_PATH,&uSize);
str.Format("lpBuffer is %s\\n",lpBuffer);
AfxMessageBox(str);

lstrcpy(_TEXT(lpDriverPath),_TEXT(lpBuffer));
lstrcat(_TEXT(lpDriverPath),_TEXT("\\\\UNIDRV.DLL"));

lstrcpy(_TEXT(lpDataFilePath),_TEXT(lpBuffer));
lstrcat(_TEXT(lpDataFilePath),_TEXT("\\\\Dragon.GPD"));

lstrcpy(_TEXT(lpConfigFilePath),_TEXT(lpBuffer));
lstrcat(_TEXT(lpConfigFilePath),_TEXT("\\\\UNIDRVUI.DLL"));

lstrcpy(_TEXT(lpHelpFilePath),_TEXT(lpBuffer));
lstrcat(_TEXT(lpHelpFilePath),_TEXT("\\\\UNIDRV.HLP"));

memset(lpDependecy,0,sizeof(lpDependecy));
lstrcat(lpDependecy,_TEXT("Unires.dll\\0Stdname.gpd\\0Dragon.ini\\0Dragon.dll\\0Dragon.inf\\0\\0"));

char *q = lpDependecy;
lstrcpy(q, _T("Unires.dll"));
q += lstrlen(_T("Unires.dll"))+1;

lstrcpy(q, _T("Stdname.gpd"));
q += lstrlen(_T("Stdname.gpd"))+1;

lstrcpy(q, _T("Dragon.ini"));
q += lstrlen(_T("Dragon.ini"))+1;

lstrcpy(q, _T("Dragon.dll"));
q += lstrlen(_T("Dragon.dll"))+1;

lstrcpy(q, _T("Dragon.inf"));
q += lstrlen(_T("Dragon.inf"))+1;

ZeroMemory(&di3, sizeof(DRIVER_INFO_3));
di3.cVersion = 0x03;
di3.pName =_TEXT("DRoad USB Printer");
di3.pEnvironment = Environment;
di3.pDriverPath = lpDriverPath;
di3.pDataFile =lpDataFilePath;
di3.pConfigFile =lpConfigFilePath;
di3.pDependentFiles = lpDependecy;
di3.pHelpFile = lpHelpFilePath;
di3.pMonitorName = NULL;
di3.pDefaultDataType = _TEXT("RAW");

SetLastError(0);
if (!AddPrinterDriver(NULL, 3, (LPBYTE)&di3))
{
dwErr = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,dwErr,NULL,buffer,sizeof(buffer),NULL);
MessageBox(buffer);
}

ZeroMemory(&pi2, sizeof(PRINTER_INFO_2));
pi2.pServerName=NULL;
pi2.pPrinterName = _TEXT("DRoad USB Printer");
pi2.pPortName = _TEXT("USB001");
pi2.pDriverName = _TEXT("DRoad USB Printer"); pi2.pPrintProcessor = _TEXT("WinPrint");
pi2.pDatatype = _TEXT("RAW");
pi2.AveragePPM = 18;

SetLastError(0);
if ((hPrinter = AddPrinter(NULL, 2, (LPBYTE)&pi2))==NULL)
{
dwErr = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,dwErr, NULL,buffer,sizeof(buffer),NULL);
MessageBox(buffer);
}

ClosePrinter(hPrinter);
头疼的还有,运行时addprinterdriver经常失败,GetLastError返回2,说系统找不到指定的文件。而如果在运行addprinterdriver之前用手工或用installshield把所有有关于驱动的文件都拷贝到GetPrinterDriverDirectory返回的目录下而且要拷贝到3的目录下,那么就不会出现这个问题了。可是addprinter成功后。这时去看打印机是否安装上了,很高兴的是安装上了,不过头疼的还有一个问题就是,当我把打印机再次插拔时,系统又提示说找到一个硬件,然后弹出硬件安装向导。这说明我的打印机根本没有安装成功。我的打印机是usb接口的。不知道还要在注册表里写些什么东东,请高手赐教指点,谢谢了!斑竹呀,这里有很多这方面的讨论,可惜没有一个是完全的,所以很多人碰到这些问题时,没有一个是可以解决的。能否整理一下这方面的知识点呢,或把代码发放出来,我相信有很多人都会感谢你的!!!
davy_yang@163.com
ppshw
驱动牛犊
驱动牛犊
  • 注册日期2004-09-01
  • 最后登录2004-11-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-10-30 22:26
C:\>rundll32 printui.dll,PrintUIEntry /if /f c:\196\e.inf /r "e虚拟打印机" /b "e虚拟打印机" /m "e虚拟打印机" /h "Intel" /v "Windows 2000",命令提示我的驱动程序不能使用,但是我能够手工用e.inf安装此打印机驱动程序,并且也可以使用,好像e.inf没有起任何作用
游客

返回顶部