Partager via


Conventions d'appel, paramètres et type de retour

Mise à jour : novembre 2007

Voici le prototype de la routine d'assistance :

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

où :

  • pidd
    Pointeur const vers un ImgDelayDescr (cf. delayimp.h) qui contient les offsets des différentes données liées aux importations, un horodatage pour les informations de liaison et un jeu d'attributs fournissant des informations complémentaires sur le contenu du descripteur. Il n'existe actuellement qu'un seul attribut, dlattrRva, qui indique que les adresses du descripteur sont des adresses virtuelles relatives (par opposition aux adresses virtuelles).

    Pour obtenir la définition de la structure PCImgDelayDescr, consultez Définitions des structures et constantes.

  • ppfnIATEntry
    Pointeur vers l'emplacement de la table des adresses d'importation (IAT) à chargement différé à mettre à jour avec l'adresse de la fonction importée. La routine d'assistance doit stocker une valeur identique à celle qu'elle va retourner à cet emplacement.

Valeurs de retour attendues

Si la fonction réussit, elle retourne l'adresse de la fonction importée.

Si la fonction échoue, elle lève une exception et retourne 0. Trois types d'exceptions peuvent être levés :

  • Paramètre non valide, ce qui se produit si les attributs de pidd ne sont pas correctement spécifiés.

  • Échec de LoadLibrary dans la DLL spécifiée.

  • Échec de GetProcAddress.

C'est à vous qu'incombe la responsabilité de gérer ces exceptions.

Notes

La convention d'appel pour la fonction d'assistance est __stdcall. Le type de la valeur de retour n'étant pas adapté, c'est FARPROC qui est utilisé. Cette fonction a une liaison C.

La valeur de retour de l'assistance de chargement différé doit être stockée à l'emplacement du pointeur fonction passé, sauf si vous voulez que votre routine d'assistance tienne lieu de raccordement de notification. Le cas échéant, votre code est responsable de la recherche du pointeur fonction approprié à retourner. Le code de thunk généré par l'éditeur de liens prend ensuite cette valeur de retour comme vraie cible de l'importation et y accède directement.

Exemple

Le code ci-dessous indique comment implémenter une fonction de raccordement simple.

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;
*/

Voir aussi

Référence

Présentation de la fonction d'assistance