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