Partilhar via


Convenções, parâmetros e tipo de retorno de chamada

Protótipo a rotina auxiliar é:

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

Onde:

  • pidd
    A Const ponteiro para um ImgDelayDescr (consulte delayimp.h) que contém os deslocamentos de vários dados relacionados à importação, um carimbo de data/hora para informações de vinculação e um conjunto de atributos que fornecem mais informações sobre o conteúdo do descritor.Atualmente, há apenas um atributo, dlattrRva, que indica que sistema autônomo endereços no descritor de endereços virtual relativos (ao contrário de endereços virtual).

    See Estrutura and constante definições para a definição da estrutura PCImgDelayDescr.

  • ppfnIATEntry
    Um ponteiro para o slot no carregamento de atraso Importar tabela de endereços (IAT) seja atualizada com o endereço da função importado.Rotina auxiliar precisa armazenar o mesmo valor que irá ser retornar para este local.

Valores de retorno esperado

Se a função for bem-sucedida, retornará o endereço da função importado.

Se a função falhar, ele gerará uma exceção e retornará 0.Três tipos de exceções podem ser elevados:

  • Parâmetro inválido, o que acontece se os atributos no pidd não estão especificados corretamente.

  • LoadLibrary falhou na DLL especificada.

  • Falha de GetProcAddress.

É sua responsabilidade para manipular essas exceções.

Comentários

A convenção de chamada para a função auxiliar é __stdcall. O tipo do valor retornado não é relevante, FARPROC é usado.Esta função tem ligação C.

O valor retornado do auxiliar de carregamento de atraso precisa ser armazenado no local de ponteiro passado em função, a menos que você queira sua rotina auxiliar a ser usado sistema autônomo um gancho de notificação.Nesse caso, seu código é responsável por localizar o ponteiro de função apropriada para retornar.O código de conversão que o vinculador gera, em seguida, usa esse valor retornado sistema autônomo o destino real da importação e vai diretamente para.

Exemplo

O código a seguir mostra como implementar uma função de gancho simples.

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

Consulte também

Referência

Noções básicas sobre a função auxiliar