Inicializar um monitor de impressão

Quando o spooler chama LoadLibrary para carregar uma DLL de monitor de impressão, o sistema chama imediatamente a função DllEntryPoint da DLL. Geralmente, é uma boa ideia que a função de ponto de entrada chame DisableThreadLibraryCalls, portanto, a DLL não é notificada desnecessariamente quando os threads são criados e excluídos.

Cada DLL exporta uma função de inicialização, que o spooler chama depois de chamar LoadLibrary. As DLLs do monitor de linguagem e as DLLs do servidor de monitor de porta exportam uma função InitializePrintMonitor2 . As DLLs da interface do usuário do monitor de porta exportam uma função InitializePrintMonitorUI .

Essas duas funções de inicialização são responsáveis por retornar ponteiros para o restante das funções definidas por monitores de impressão, para que o spooler possa chamá-los. As funções de inicialização também podem executar operações de inicialização de tempo de carga. A função InitializePrintMonitor2 do monitor retorna um identificador de instância de monitor. O monitor deve alocar memória local para armazenar informações específicas da instância e usar o identificador de monitor como um identificador para a memória alocada.

Quando o spooler é iniciado pela primeira vez, ele carrega todas as DLLs de monitor que foram instaladas. Depois de chamar todas as funções de inicialização do monitor, o spooler chama a função EnumPorts de cada monitor de porta, que enumera as portas compatíveis com o monitor. (Um monitor dá suporte a uma porta se a porta tiver sido adicionada ao banco de dados do monitor, conforme descrito em Adicionar uma porta.) Cada porta com suporte é aberta, conforme descrito em Abrir e fechar uma porta.