Compartir a través de


Convenciones de llamada, parámetros y tipo de valor devuelto

Actualización: noviembre 2007

El prototipo de rutina auxiliar es:

FARPROC WINAPI __delayLoadHelper2( 
   PCImgDelayDescr pidd,
   FARPROC * ppfnIATEntry
);

donde:

  • pidd
    Puntero const a un descriptor ImgDelayDescr (vea delayimp.h) que contiene los desplazamientos de diversos datos relacionados con la importación, una marca de hora para información de enlace y un conjunto de atributos que proporcionan información adicional sobre el contenido del descriptor. Actualmente sólo hay un atributo, dlattrRva, que indica que las direcciones del descriptor son direcciones virtuales relativas (a diferencia de las direcciones virtuales).

    Vea Definiciones de estructura y de constante para ver la definición de la estructura PCImgDelayDescr.

  • ppfnIATEntry
    Puntero a la ranura de la tabla de direcciones de importación (IAT) de carga retrasada que se actualizará con la dirección de la función importada. La rutina auxiliar necesita almacenar el mismo valor que devolverá a esta ubicación.

Valores devueltos esperados

Si la función se ejecuta correctamente, devuelve la dirección de la función importada.

Si la función no se ejecuta correctamente, inicia una excepción y devuelve 0. Los tipos de excepción que se pueden iniciar son tres:

  • Parámetro no válido, que se produce si los atributos de pidd no se especifican correctamente.

  • LoadLibrary ha producido un error en la DLL especificada.

  • Error de GetProcAddress.

El control de estas excepciones es responsabilidad del usuario.

Comentarios

La convención de llamada para la función auxiliar es __stdcall. El tipo de valor devuelto no es importante, por tanto, se utiliza FARPROC. Esta función está vinculada a C.

El valor devuelto de la rutina auxiliar de carga retrasada se tiene que almacenar en la ubicación de puntero de la función pasada, salvo que se desee utilizar la rutina auxiliar como enlace de notificación. En ese caso, el código propio es el responsable de buscar el puntero a función apropiado que se ha de devolver. El código de thunk que genera el vinculador toma entonces ese valor devuelto como destino verdadero de la importación y salta directamente a él.

Ejemplo

El código siguiente muestra cómo implementar una función de enlace sencilla.

FARPROC WINAPI delayHook(unsigned dliNotify, PDelayLoadInfo pdli)
{
    switch (dliNotify) {
        case dliStartProcessing :

            // If you want to return control to the helper, return 0.
            // Otherwise, return a pointer to a FARPROC helper function
            // that will be used instead, thereby bypassing the rest 
            // of the helper.

            break;

        case dliNotePreLoadLibrary :

            // If you want to return control to the helper, return 0.
            // Otherwise, return your own HMODULE to be used by the 
            // helper instead of having it call LoadLibrary itself.

            break;

        case dliNotePreGetProcAddress :

            // If you want to return control to the helper, return 0.
            // If you choose you may supply your own FARPROC function 
            // address and bypass the helper's call to GetProcAddress.

            break;

        case dliFailLoadLib : 

            // LoadLibrary failed.
            // If you don't want to handle this failure yourself, return 0.
            // In this case the helper will raise an exception 
            // (ERROR_MOD_NOT_FOUND) and exit.
            // If you want to handle the failure by loading an alternate 
            // DLL (for example), then return the HMODULE for 
            // the alternate DLL. The helper will continue execution with 
            // this alternate DLL and attempt to find the
            // requested entrypoint via GetProcAddress.

            break;

        case dliFailGetProc :

            // GetProcAddress failed.
            // If you don't want to handle this failure yourself, return 0.
            // In this case the helper will raise an exception 
            // (ERROR_PROC_NOT_FOUND) and exit.
            // If you choose you may handle the failure by returning 
            // an alternate FARPROC function address.


            break;

        case dliNoteEndProcessing : 

            // This notification is called after all processing is done. 
            // There is no opportunity for modifying the helper's behavior
            // at this point except by longjmp()/throw()/RaiseException. 
            // No return value is processed.

            break;

        default :

            return NULL;
    }

    return NULL;
}

/* 
and then at global scope somewhere
PfnDliHook __pfnDliNotifyHook2 = delayHook;
*/

Vea también

Referencia

Descripción de la función auxiliar