下载特定于队列的文件
如果用户决定创建从客户端系统到打印服务器的打印机连接,并且安装应用程序在 打印机安装过程中创建了支持点和打印中所述的注册表项,则会发生以下事件:
用户应用程序调用 AddPrinterConnection。
客户端的远程打印提供程序 (Win32spl.dll) 创建与服务器的连接。
服务器的后台处理程序将驱动程序文件发送到客户端。
客户端的Win32spl.dll调用服务器上的 EnumPrinterKey 和 EnumPrinterDataEx 来复制打印机的注册表项。
由于服务器的后台处理程序在处理 EnumPrinterDataEx 期间枚举注册表值,因此每次遇到打印机 CopyFiles 密钥的子项(例如 CopyFiles\ICM)时,它都会执行以下操作:
加载 Point 和 Print DLL(如果指定),并调用其 GenerateCopyFilePaths 函数,该函数可以修改源和/或目标路径。
基于 GenerateCopyFilePaths 返回的源路径和目标路径创建 SourceDir 和 TargetDir 密钥,并将其作为 EnumPrinterDataEx 数据返回给客户端后台处理程序。 (server 上实际上不存在这些密钥。)
客户端的Win32spl.dll缓存为响应 EnumPrinterData 和 EnumPrinterDataEx 调用而收到的打印机密钥。
对于打印机 CopyFiles 密钥的每个子项(例如 CopyFiles\ICM),客户端Win32spl.dll执行以下操作:
加载本地 Point 和 Print DLL(如果已提供),并调用其 GenerateCopyFilePaths 函数,该函数可以修改源和/或目标路径。 (输入是从 server.)
从服务器下载与 Files 密钥关联的所有文件。
记录事件,指示已下载 Point 和 Print 文件。
调用 Point 和 Print DLL 的 SpoolerCopyFileEvent 函数(如果提供了 DLL),并指定COPYFILE_EVENT_FILES_CHANGED事件。
客户端后台处理程序调用驱动程序的 DrvPrinterEvent 函数,指定PRINTER_EVENT_CACHE_REFRESH事件。
客户端后台处理程序再次调用驱动程序的 DrvPrinterEvent 函数,并指定PRINTER_EVENT_ADD_CONNECTION事件。
如果提供了 Point 和 Print DLL,客户端后台处理程序将调用其 SpoolerCopyFileEvent 函数,并指定COPYFILE_EVENT_ADD_PRINTER_CONNECTION事件。
连接示例
例如,假设安装应用程序已定义安装示例中所述的服务器注册表项。 此外,假设服务器名为 NTPRINT,客户端名为 MyClient。
若要连接到名为 NTPRINT 上的 HpColor 的打印队列,MyClient 上的用户应用程序调用 AddPrinterConnection ,如下所示:
AddPrinterConnection("\\NTPRINT\HpColor")
在服务器上,后台处理程序加载Mscms.dll并调用 GenerateCopyFilePaths ,如下所示:
GenerateCopyFilePaths(
"HpColor",
"Color",
&SplclientInfo1,
1,
\\NTPRINT\PRINT$\Color,
&dwSourceDirSize,
"Color",
&dwDestDirSize,
COPYFILE_FLAG_SERVER_SPOOLER)
Microsoft ICM 的Mscms.dll模块不会修改源或目标路径,因此只返回ERROR_SUCCESS。
服务器后台处理程序将以下密钥返回到 MyClient:
SourceDir: \\NTPRINT\PRINT$\Color
TargetDir: "Color"
在客户端上, TargetDir 的值扩展为 C:\Winnt\System32\Spool\Drivers\Color。
MyClient 上的后台处理程序执行以下操作:
下载Mscms.dll并调用 GenerateCopyFilePaths ,如下所示:
GenerateCopyFilePaths( "\\NTPRINT\HpColor", "Color", &SplclientInfo1, 1, \\NTPRINT\PRINT$\Color, &dwSourceDirSize, "C:\Winnt\System32\Spool\Drivers\Color", &dwDestDirSize, COPYFILE_FLAG_CLIENT_SPOOLER)
Microsoft ICM 的Mscms.dll模块不会修改源或目标路径,因此只返回ERROR_SUCCESS。
将 Hpclrlsr.icm 下载到 C:\Winnt\System32\Spool\Drivers\Color。
记录事件,指示已下载 Point 和 Print 文件。
在 Mscms.dll 中调用 SpoolerCopyFileEvent 函数,并指定COPYFILE_EVENT_FILES_CHANGED事件。
调用打印机驱动程序的 DrvPrinterEvent 函数,指定PRINTER_EVENT_CACHE_REFRESH事件。
再次调用打印机驱动程序的 DrvPrinterEvent 函数,指定PRINTER_EVENT_ADD_CONNECTION事件。
在 Mscms.dll 中调用 SpoolerCopyFileEvent 函数,并指定COPYFILE_EVENT_ADD_PRINTER_CONNECTION事件。