Chiamata alla libreria DbgHelp

Anche se DbgHelp.dll viene fornito con tutte le versioni di Windows, i chiamanti dovrebbero prendere in considerazione l'uso di una delle versioni più recenti di questa DLL, come illustrato nel pacchetto Strumenti di debug per Windows . Per informazioni dettagliate sulla distribuzione di DbgHelp, vedere Versioni dbgHelp.

Quando si usa DbgHelp, la strategia migliore consiste nell'installare una copia della libreria dal pacchetto Strumenti di debug per Windows nella directory dell'applicazione adiacente logicamente al software che lo chiama. Se sono necessari anche server di simboli e server di origine, sia SymSrv.dll che SrcSrv.dll devono essere installati nella stessa directory di DbgHelp.dll, perché DbgHelp chiamerà queste DLL solo se condividono la stessa directory con esso. Si noti che DbgHelp non chiamerà queste due DLL dal percorso di ricerca standard. Ciò consente di evitare l'utilizzo di DLL non corrispondenti; allo stesso modo, migliora anche la sicurezza complessiva.

Il codice seguente viene estratto dall'origine DbgHelp. Mostra come DbgHelp carica solo le versioni di SymSrv.dll e SrcSrv.dll dalla stessa directory in cui risiede DbgHelp.dll.

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;
}

Dopo aver caricato queste due DLL, DbgHelp chiama GetProcAddress per ottenere le funzioni necessarie.

In genere, il codice che chiama DbgHelp.dll garantisce che la versione corretta venga caricata installando DbgHelp.dll nella stessa directory dell'applicazione che ha avviato il processo corrente. Se il codice chiamante si trova in una DLL e non ha accesso o non ha accesso alla posizione del processo iniziale, è necessario installare DbgHelp.dll insieme alla DLL chiamante e al codice simile a LoadDLL di DbgHelp.

Versioni di DbgHelp

Loadlibrary

GetProcAddress

GetModuleFileName