Baixar arquivos específicos da fila
Se um usuário decidir criar uma conexão de impressora de um sistema cliente para um servidor de impressão e se um aplicativo de instalação tiver criado as entradas do Registro descritas em Ponto de Suporte e Impressão durante as instalações da impressora, ocorrerão os seguintes eventos:
O aplicativo de usuário chama AddPrinterConnection.
O provedor de impressão remota do cliente (Win32spl.dll) cria uma conexão com o servidor.
O spooler do servidor envia arquivos de driver para o cliente.
O Win32spl.dll do cliente chama EnumPrinterKey e EnumPrinterDataEx no servidor para copiar as entradas do registro da impressora.
Como o spooler do servidor enumera valores de registro durante o processamento de EnumPrinterDataEx, ele executa as seguintes operações sempre que encontra uma subchave da chave CopyFiles da impressora, como CopyFiles\ICM:
Carrega a DLL de Ponto e Impressão, se especificada, e chama sua função GenerateCopyFilePaths , que pode modificar caminhos de origem e/ou de destino.
Cria chaves SourceDir e TargetDir , com base em caminhos de origem e destino retornados por GenerateCopyFilePaths, e as retorna ao spooler do cliente como dados EnumPrinterDataEx. (Essas chaves realmente não existem no servidor.)
O Win32spl.dll do cliente armazena em cache as chaves de impressora recebidas em resposta às chamadas EnumPrinterData e EnumPrinterDataEx.
Para cada subchave da chave CopyFiles da impressora, como CopyFiles\ICM, o Win32spl.dll do cliente executa as seguintes operações:
Carrega a DLL de Ponto e Impressão local, se for fornecida, e chama sua função GenerateCopyFilePaths , que pode modificar caminhos de origem e/ou de destino. (As entradas são as chaves SourceDir e TargetDir recebidas do servidor.)
Baixa todos os arquivos associados à chave Arquivos do servidor.
Registra um evento, indicando que os arquivos Point e Print foram baixados.
Chama a função SpoolerCopyFileEvent da DLL de Ponto e Impressão, se uma DLL for fornecida, especificando um evento COPYFILE_EVENT_FILES_CHANGED.
O spooler do cliente chama a função DrvPrinterEvent do driver, especificando um evento PRINTER_EVENT_CACHE_REFRESH.
O spooler do cliente chama a função DrvPrinterEvent do driver novamente, especificando um evento PRINTER_EVENT_ADD_CONNECTION.
Se uma DLL de Ponto e Impressão for fornecida, o spooler do cliente chamará sua função SpoolerCopyFileEvent , especificando um evento COPYFILE_EVENT_ADD_PRINTER_CONNECTION.
Exemplo de conexão
Por exemplo, suponha que um aplicativo de instalação tenha definido as entradas do registro de servidor descritas no exemplo de instalação. Além disso, suponha que o servidor seja chamado de NTPRINT e que o cliente se chama MyClient.
Para se conectar à fila de impressão chamada HpColor no NTPRINT, um aplicativo de usuário no MyClient chama AddPrinterConnection da seguinte maneira:
AddPrinterConnection("\\NTPRINT\HpColor")
No servidor, o spooler carrega Mscms.dll e chama GenerateCopyFilePaths da seguinte maneira:
GenerateCopyFilePaths(
"HpColor",
"Color",
&SplclientInfo1,
1,
\\NTPRINT\PRINT$\Color,
&dwSourceDirSize,
"Color",
&dwDestDirSize,
COPYFILE_FLAG_SERVER_SPOOLER)
O módulo Mscms.dll do Microsoft ICM não modifica os caminhos de origem ou de destino, portanto, ele apenas retorna ERROR_SUCCESS.
O spooler do servidor retorna as seguintes chaves para MyClient:
SourceDir: \\NTPRINT\PRINT$\Color
TargetDir: "Color"
No cliente, o valor de TargetDir se expande para C:\Winnt\System32\Spool\Drivers\Color.
O spooler no MyClient executa as seguintes operações:
Baixa Mscms.dll e chama GenerateCopyFilePaths da seguinte maneira:
GenerateCopyFilePaths( "\\NTPRINT\HpColor", "Color", &SplclientInfo1, 1, \\NTPRINT\PRINT$\Color, &dwSourceDirSize, "C:\Winnt\System32\Spool\Drivers\Color", &dwDestDirSize, COPYFILE_FLAG_CLIENT_SPOOLER)
O módulo Mscms.dll do Microsoft ICM não modifica os caminhos de origem ou de destino, portanto, ele apenas retorna ERROR_SUCCESS.
Baixa Hpclrlsr.icm para C:\Winnt\System32\Spool\Drivers\Color.
Registra um evento, indicando que os arquivos Point e Print foram baixados.
Chama a função SpoolerCopyFileEvent em Mscms.dll, especificando um evento COPYFILE_EVENT_FILES_CHANGED.
Chama a função DrvPrinterEvent do driver de impressora, especificando um evento PRINTER_EVENT_CACHE_REFRESH.
Chama a função DrvPrinterEvent do driver de impressora novamente, especificando um evento PRINTER_EVENT_ADD_CONNECTION.
Chama a função SpoolerCopyFileEvent em Mscms.dll, especificando um evento COPYFILE_EVENT_ADD_PRINTER_CONNECTION.