Sdílet prostřednictvím


Konvence volání, parametry a návratový typ

Prototyp pomocnou rutinou je:

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

kde:

  • pidd
    Objekt const ukazatel na ImgDelayDescr (viz delayimp.h), který obsahuje posuny různá související s importovat data, časového razítka pro informace o vazbě a sadu atributů, které poskytují další informace o obsahu, popisovače.Aktuálně je pouze jeden atribut dlattrRva, která označuje, že adresy v popisovač jsou relativní virtuální adresy (na rozdíl od virtuální adresy).

    Pro definici PCImgDelayDescr strukturu, naleznete v tématu Struktura a definice konstant.

  • ppfnIATEntry
    Ukazatel na pozici v načtení zpoždění importovat tabulky adres (IAT) k aktualizaci s adresou importovaných funkcí.Pomocná rutina potřebuje k uložení stejnou hodnotu, která bude vrácení hodnoty do tohoto umístění.

Byl očekáván vrácené hodnoty

Pokud je funkce úspěšná, vrátí adresu importovaných funkcí.

Pokud je funkce selže, vyvolá výjimku a vrátí hodnotu 0.Mohou být vyvolány tři typy výjimky:

  • Neplatný parametr, který se stane, když atributů v pidd nejsou zadány správně.

  • LoadLibraryv určené knihovny DLL se nezdařilo.

  • Selhání GetProcAddress.

Vaší povinností je, aby tyto výjimky zpracovat.

Poznámky

Konvence volání pro funkci Pomocník je __stdcall.Typ vrácené hodnoty není důležité, takže se používá FARPROC.Tato funkce má C propojením.

Vrátí hodnotu, která Pomocník zatížení zpoždění musí být uložen v umístění ukazatele předaný funkci, pokud nechcete, aby vaše pomocnou rutinou, který se má použít jako oznámení hák.V takovém případě váš kód je zodpovědná za hledání příslušnou funkci ukazatel má být vrácena.Převod kód, který generuje propojovací program poté potřebná že návratovou hodnotu jako skutečnou cíl pro import a přejde k němu.

Ukázka

Následující kód ukazuje, jak implementovat jednoduché hák funkci.

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

Viz také

Referenční dokumentace

Základní informace o podpůrné funkci