Compartilhar via


Chamando a Biblioteca DbgHelp

Embora o DbgHelp.dll seja fornecido com todas as versões do Windows, os usuários devem considerar usar uma das versões mais recentes desta DLL como encontrada no pacote Ferramentas de Depuração para Windows. Para obter detalhes sobre a distribuição de DbgHelp, consulte Versões DbgHelp.

Ao usar dbgHelp, a melhor estratégia é instalar uma cópia da biblioteca do pacote Ferramentas de Depuração para Windows no diretório do aplicativo logicamente adjacente ao software que a chama. Se o Servidor de Símbolos e o Servidor de Origem também forem necessários, SymSrv.dll e SrcSrv.dll deverão ser instalados no mesmo diretório que DbgHelp.dll, pois dbgHelp só chamará essas DLLs se compartilharem o mesmo diretório com ele. (Observe que dbgHelp não chamará essas duas DLLs do caminho de pesquisa padrão.) Isso ajuda a evitar o uso de DLLs incompatíveis; da mesma forma, também melhora a segurança em geral.

O código a seguir é extraído da fonte DbgHelp. Ele mostra como o DbgHelp carrega apenas versões de SymSrv.dll e SrcSrv.dll do mesmo diretório em que o DbgHelp.dll reside.

HINSTANCE ghinst;

// For calculating the size of arrays for safe string functions.

#ifndef cch
 #define ccht(Array, EltType) (sizeof(Array) / sizeof(EltType))
 #define cch(Array) ccht(Array, (Array)[0])
#endif

//
// LoadLibrary() a DLL, using the same directory as dbghelp.dll.
//

HMODULE 
LoadDLL(
    __in PCWSTR filename
    )
{
    WCHAR drive[10] = L"";
    WCHAR dir[MAX_PATH + 1] = L"";
    WCHAR file[MAX_PATH + 1] = L"";
    WCHAR ext[MAX_PATH + 1] = L"";
    WCHAR path[MAX_PATH + 1] = L"";
    HMODULE hm;
    
    // Chop up 'filename' into its elements.
    
    _wsplitpath_s(filename, drive, cch(drive), dir, cch(dir), file, cch(file), ext, cch(ext));

    // If 'filename' contains no path information, then get the path to our module and 
    // use it to create a fully qualified path to the module we are loading.  Then load it.
    
    if (!*drive && !*dir) 
    {
        // ghinst is the HINSTANCE of this module, initialized in DllMain or WinMain
         
        if (GetModuleFileNameW(ghinst, path, MAX_PATH)) 
        {
            _wsplitpath_s(path, drive, cch(drive), dir, cch(dir), NULL, 0, NULL, 0);
            if (*drive || *dir) 
            {
                swprintf_s(path, cch(path), L"%s%s%s%s", drive, dir, file, ext);
                hm = LoadLibrary(path);
                if (hm)
                    return hm;
            }
        }
    }
    else
    {
        // If we wanted to, we could have LoadDLL also support directories being specified
        // in 'filename'.  We could pass the path here.  The result is if no path is specified,
        // the module path is used as above, otherwise the path in 'filename' is specified.
        // But the standard search logic of LoadLibrary is still avoided.
        
        /*
        hm = LoadLibrary(path);
        if (hm)
            return hm;
        */
    }
    
    return 0;
}

Depois de carregar essas duas DLLs, dbgHelp chama GetProcAddress para obter as funções necessárias.

Normalmente, o código que chama DbgHelp.dll garante que a versão correta seja carregada instalando DbgHelp.dll no mesmo diretório que o aplicativo que iniciou o processo atual. Se o código de chamada estiver em uma DLL e não tiver acesso ou conhecimento do local do processo inicial, DbgHelp.dll deverá ser instalado junto com a DLL de chamada e o código semelhante ao LoadDLL do DbgHelp deverá ser usado.

Versões DbgHelp

LoadLibrary

GetProcAddress

GetModuleFileName