请问各位大侠CreateDC StartDoc如何使用共享打印机?

neohope 2009-10-14 11:25:48
小弟最近在学习打印功能,现在遇到了一个问题,就是无法使用共享打印机打印,具体情况如下:
我的电脑中有三台打印机:PDF虚拟打印机,HP网络打印机(同一网段),Epson共享打印机(同一网段)

我遇到的问题是,我用CreateDC可以获取PDF及HP的句柄,后来用EnumPrinter后,保存了Epson的名称,也可以用CreateDC获取Epson的句柄(命名方式为//IP//PrinterName),我确信三者的句柄都不为空

这样,我用StartDoc和StartPage后,可以在PDF及HP上打印出空白页,但在Epson上打印,却总是不成功,没有出过一页纸,请问各位老大,用共享打印机时与其他打印机有什么不同吗?要有其他初始化工作吗?

Epson上有用户名及密码,但是用一次后就不用再设置密码了,直到下一次重启
我用word可以在Epson上进行打印,是可以通过的,但我的程序就是不行,麻烦各位老大指点一下,谢谢!
...全文
767 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
neohope 2009-10-19
  • 打赏
  • 举报
回复
恩,再罗嗦一下
hToken=LogonUser(username,'.',password,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&Token); 这样的话,我没有成功过

但是利用Explorer的Token,就可以了。

要是谁知道为什么LogonUser不行的话,或者我哪里弄错了,麻烦发个消息告知一下,呵呵。十分感谢!
chehw 2009-10-19
  • 打赏
  • 举报
回复
尝试一下:
1. 服务配置中勾选“允许服务与桌面交互”。
2. LogonUser前先AdjustTokenPrivileges来Enable "SE_INTERACTIVE_LOGON_NAME"
3. 如果不行,LogonUser中的dwLogonType换成LOGON32_LOGON_NETWORK试一下
neohope 2009-10-16
  • 打赏
  • 举报
回复
hToken=LogonUser(username, password);
ImpersonateLoggedOnUser(hToken);

我用Administrator,在StartDoc时,返回“RPC 服务器不可用”
我的PrintSpooler,RPC,RPC Localer都开了啊,疯了。。。

neohope 2009-10-15
  • 打赏
  • 举报
回复
谢谢chehw,我明天试试,呵呵
chehw 2009-10-15
  • 打赏
  • 举报
回复
本地系统账户(SYSTEM)对网络共享资源的访问权限是受限制的(似乎是以 YourComputerName$的身份去访问的),因而无法访问共享打印机。

可以将服务配置中的登录身份改为域账户(需要有AD),
或是在程序中
hToken=LogonUser(username, password);
ImpersonateLoggedOnUser(hToken);
后在CreateDC(); StartDoc(); ...
neohope 2009-10-15
  • 打赏
  • 举报
回复
谢谢各位的热心!

我找到问题所在了,但仍不知如何解决:

我是在服务里做打印的,登录用户为System,允许与桌面交互
这样在StartDoc时,返回值为“拒绝访问”

而改用其他用户的话,比如Administrator,就可以进行打印了

请问一下各位,我若是仍想用System登录,那应该怎么办呢?

其中:
在其他打印机上,安全选项中都是4个:Administrator , Create Owener ,Everyone, Power User
在共享打印机上,安全选项中只有三个:Administrator , Create Owener ,Everyone

谢谢!

快乐鹦鹉 2009-10-14
  • 打赏
  • 举报
回复
你非得找共享打印机干啥。
找个VC 打印机的源代码,看一下你的共享打印机能否打印。
按理说,共享打印机无非是个路径的问题吧。哪会有那么多问题。否则肯定有一堆帖子讨论这个问题了。
neohope 2009-10-14
  • 打赏
  • 举报
回复
比如?Google: VC使用共享打印机
第一个帖子,是本帖子
快乐鹦鹉 2009-10-14
  • 打赏
  • 举报
回复
现成的打印代码很多,何不弄几个学一学。
快乐鹦鹉 2009-10-14
  • 打赏
  • 举报
回复
从网上下段打印代码试试吧。
chehw 2009-10-14
  • 打赏
  • 举报
回复
CreateDC时需要传递一个DEVMODE *

须三次调用DocumentProperties:
LPDEVMODE pDevMode=NULL;
DWORD dwBytes=0;
//**1. 第一次调用获取所需的缓冲区大小:
dwBytes=DocumentProperties(....,0);
pDevMode=(LPDEVMODE)LocalAlloc(LPTR, dwBytes);

//**2. 第二次调用获取默认配置
DocumentProperties(...., pDevMode, NULL, DM_OUT_BUFFER);
ModifyDevMode(pDevMode);

//**3. 第三次调用获取修改后的结果
DocumentProperties(...., pDevMode, pDevMode, DM_OUT_BUFFER|DM_IN_PROMPT);

//××4. 三次调用后传递给CreateDC的最后一个参数
hPrinterDC=CreateDC("winspool", lpszPrinterName, NULL, pDevMode);
StartDoc();
StartPage();
EndPage();
EndDoc();
DeleteDC();
LocalFree(pDevMode);
快乐鹦鹉 2009-10-14
  • 打赏
  • 举报
回复
所以让你看看别人的程序,有什么不同。
一是看别人的程序是否可以用你的共享打印机,如果可以,那么看别人的代码和你有何不同。以此来解释你心中的疑惑。
neohope 2009-10-14
  • 打赏
  • 举报
回复
按理说,共享打印机无非是个路径的问题吧。

我以前也是这么想的

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧