Compartir a través de


Creación del complemento

Importante

La plataforma de impresión moderna es el medio preferido de Windows para comunicarse con impresoras. Se recomienda usar el controlador de clase de bandeja de entrada IPP de Microsoft, junto con aplicaciones de soporte técnico de impresión (PSA), para personalizar la experiencia de impresión en Windows 10 y 11 para el desarrollo de dispositivos de impresora.

Para obtener más información, consulte Plataforma de impresión moderna y la Guía de diseño de aplicaciones para compatibilidad con impresión.

Todos los complementos del controlador de impresora deben definir las funciones DllMain, DllGetClassObject y DllCanUnloadNow. También deben implementar la interfaz COM IClassFactory y una de las interfaces COM IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS o IPrintOemPS2.

Al crear un complemento de interfaz de usuario o un complemento de representación, debe basar el código en el complemento de interfaz de usuario de ejemplo o en los complementos de representación de ejemplo proporcionados en el WDK.

Para crear cualquier tipo de complemento, debe hacer lo siguiente:

  1. Defina una función DllMain (descrita en la documentación del SDK de Windows.

    Este es el punto de entrada de todos los archivos DLL de Win32.

  2. Defina y exporte una función DllGetClassObject (que se describe en la documentación del SDK de Windows).

    El controlador de impresora llama a esta función para obtener acceso a la implementación del complemento de la interfaz IClassFactory (que se describe en la documentación del SDK de Windows). Cuando el controlador llama a DllGetClassObject, especifica uno de los siguientes identificadores de clase (definidos en prcomoem.h):

    CLSID_OEMUI: para complementos de interfaz de usuario

    CLSID_OEMRENDER: para complementos de representación

    El controlador también especifica un identificador de interfaz de IID_IClassFactory.

    La función DllGetClassObject debe crear una instancia de su interfaz IClassFactory y devolver un puntero a ella, como se muestra en el código de ejemplo.

  3. Implemente la interfaz COM de IClassFactory.

    El método CreateInstance de la interfaz IClassFactory debe crear una instancia de la implementación del complemento de una de las siguientes interfaces COM:

    IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS o IPrintOemPS2

    Una de las entradas del método CreateInstance es un identificador de interfaz. El controlador llama a CreateInstance con un identificador de interfaz de IID_IUnknown, lo que significa que el método CreateInstance debe devolver un puntero a la interfaz IUnknown de la instancia creada (que se describe en la documentación del SDK de Windows), como se muestra en el código de ejemplo.

  4. Implemente una de las interfaces IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni2, IPrintOemUni3, IPrintOemPS o IPrintOemPS2, incluida la interfaz IUnknown estándar, como se muestra en el código de ejemplo.

    El primero de los métodos implementados a los que llamará el controlador es el método QueryInterface de la interfaz IUnknown (que se describe en la documentación del SDK de Windows). Este método recibe uno de los identificadores de interfaz de los controladores de impresora como argumento de entrada. El controlador llama al método para determinar qué versión de la interfaz es compatible con el complemento y para recibir un puntero a la interfaz admitida.

  5. Defina y exporte una función DllCanUnloadNow (que se describe en la documentación del SDK de Windows).

    La función DllCanUnloadNow debe devolver S_OK si se han publicado todas las instancias de las interfaces IPrintOemUI, IPrintOemUI2, IPrintOemUni, IPrintOemUni, IPrintOemUni3, IPrintOemUni3, IPrintOemPS o IPrintOemPS2. La devolución S_OK indica al controlador que se puede descargar el complemento.

    Tenga en cuenta que cuando el controlador de impresora descarga el archivo DLL del complemento, primero llama a la función DllCanUnloadNow del complemento. Independientemente del valor devuelto por DllCanUnloadNow, el controlador de impresora descarga el archivo DLL del complemento llamando a la función FreeLibrary. Esto se hace para asegurarse de que el archivo DLL del complemento se descarga antes de descargar el controlador.

    Si el archivo DLL del complemento debe permanecer cargado (por ejemplo, cuando crea un subproceso que usa el archivo DLL del complemento), el subproceso debe cargar el archivo DLL mediante una llamada a la función LoadLibrary. Cuando el subproceso termine con el archivo DLL, debe llamar a la función FreeLibraryAndExitThread para descargarlo. En una situación en la que un subproceso ha llamado LoadLibrary, la llamada del controlador a FreeLibrary simplemente disminuye el recuento de referencias del archivo DLL, lo que impide que se descargue. Las funciones LoadLibrary, FreeLibrary y FreeLibraryAndExitThread se describen en la documentación del SDK de Windows.