Скачивание файлов для конкретных очередей
Если пользователь решает создать подключение принтера из клиентской системы к серверу печати и если приложение установки создало записи реестра, описанные в разделе Поддержка точек и печати во время установки принтера, возникают следующие события:
Пользовательское приложение вызывает AddPrinterConnection.
Поставщик удаленной печати клиента (Win32spl.dll) создает подключение к серверу.
Диспетчер очереди сервера отправляет файлы драйверов клиенту.
Клиентский Win32spl.dll вызывает EnumPrinterKey и EnumPrinterDataEx на сервере для копирования записей реестра принтера.
Так как сервер очереди очереди перечисляет значения реестра во время обработки EnumPrinterDataEx, он выполняет следующие операции при каждом обнаружении подраздела ключа CopyFiles принтера, например CopyFiles\ICM:
Загружает библиотеки DLL Point и Print , если они указаны, и вызывает ее функцию GenerateCopyFilePaths , которая может изменять исходные и (или) целевые пути.
Создает ключи SourceDir и TargetDir на основе исходных и целевых путей, возвращенных GenerateCopyFilePaths, и возвращает их в очередь клиента в виде данных EnumPrinterDataEx. (Эти ключи на самом деле не существуют на сервере.)
Клиентская Win32spl.dll кэширует ключи принтера, полученные в ответ на вызовы EnumPrinterData и EnumPrinterDataEx.
Для каждого подраздела ключа CopyFiles принтера, например CopyFiles\ICM, Win32spl.dll клиента выполняет следующие операции:
Загружает локальную библиотеку DLL Point и Print, если она указана, и вызывает ее функцию GenerateCopyFilePaths , которая может изменять исходные и (или) конечные пути. (Входные данные — это ключи SourceDir и TargetDir , полученные с сервера.)
Скачивает с сервера все файлы, связанные с ключом Files .
Регистрирует событие, указывающее, что файлы point и print были загружены.
Вызывает функцию SpoolerCopyFileEvent библиотеки DLL Point и Print, если она указана, указывая событие COPYFILE_EVENT_FILES_CHANGED.
Клиентская очередь очереди вызывает функцию DrvPrinterEvent драйвера, указывая событие PRINTER_EVENT_CACHE_REFRESH.
Клиент очереди очереди снова вызывает функцию DrvPrinterEvent драйвера, указывая событие PRINTER_EVENT_ADD_CONNECTION.
Если указана библиотека DLL для точек и печати, клиент вызывает свою функцию SpoolerCopyFileEvent , указывая событие COPYFILE_EVENT_ADD_PRINTER_CONNECTION.
Пример подключения
Например, предположим, что приложение установки определило записи реестра сервера, описанные в примере установки. Кроме того, предположим, что сервер называется NTPRINT, а клиент — MyClient.
Чтобы подключиться к очереди печати с именем HpColor в NTPRINT, пользовательское приложение в MyClient вызывает AddPrinterConnection следующим образом:
AddPrinterConnection("\\NTPRINT\HpColor")
На сервере диспетчер очереди очереди загружает Mscms.dll и вызывает GenerateCopyFilePaths следующим образом:
GenerateCopyFilePaths(
"HpColor",
"Color",
&SplclientInfo1,
1,
\\NTPRINT\PRINT$\Color,
&dwSourceDirSize,
"Color",
&dwDestDirSize,
COPYFILE_FLAG_SERVER_SPOOLER)
Модуль Mscms.dll Microsoft ICM не изменяет исходные или конечные пути, поэтому он просто возвращает 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)
Модуль Mscms.dll Microsoft ICM не изменяет исходные или конечные пути, поэтому он просто возвращает ERROR_SUCCESS.
Загружает Hpclrlsr.icm в папку C:\Winnt\System32\Spool\Drivers\Color.
Регистрирует событие, указывающее, что файлы point и print были загружены.
Вызывает функцию SpoolerCopyFileEvent в Mscms.dll, указывая событие COPYFILE_EVENT_FILES_CHANGED.
Вызывает функцию DrvPrinterEvent драйвера принтера, указывая событие PRINTER_EVENT_CACHE_REFRESH.
Снова вызывает функцию DrvPrinterEvent драйвера принтера, указывая событие PRINTER_EVENT_ADD_CONNECTION.
Вызывает функцию SpoolerCopyFileEvent в Mscms.dll, указывая событие COPYFILE_EVENT_ADD_PRINTER_CONNECTION.