Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Hoewel DbgHelp.dll wordt geleverd met alle versies van Windows, moeten bellers overwegen een van de recentere versies van deze DLL te gebruiken, zoals te vinden is in het pakket Foutopsporingsprogramma's voor Windows. Zie DbgHelp-versiesvoor meer informatie over de distributie van DbgHelp.
Wanneer u DbgHelp gebruikt, is de beste strategie om een kopie van de bibliotheek te installeren vanuit het Foutopsporingsprogramma's voor Windows-pakket in de toepassingsmap, logisch naast de software die deze aanroept. Als symboolserver en bronserver ook nodig zijn, moeten zowel SymSrv.dll als SrcSrv.dll worden geïnstalleerd in dezelfde map als DbgHelp.dll, omdat DbgHelp deze DLL's alleen aanroept als ze dezelfde map met deze map delen. (Houd er rekening mee dat DbgHelp deze twee DLL's niet vanuit het standaardzoekpad aanroept.) Dit helpt het gebruik van niet-overeenkomende DLL's te voorkomen; het verbetert tevens de algemene beveiliging.
De volgende code wordt geëxtraheerd uit de Source DbgHelp. Het laat zien hoe DbgHelp alleen versies van SymSrv.dll laadt en SrcSrv.dll uit dezelfde map waarin DbgHelp.dll zich bevindt.
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;
}
Na het laden van deze twee DLL's roept DbgHelp GetProcAddress- aan om de functies te verkrijgen die nodig zijn.
Normaal gesproken zorgt code die DbgHelp.dll aanroept ervoor dat de juiste versie wordt geladen door DbgHelp.dll te installeren in dezelfde map als de toepassing die het huidige proces heeft gestart. Als de aanroepende code zich in een DLL bevindt en geen toegang heeft tot of kennis heeft van de locatie van het eerste proces, moet DbgHelp.dll naast het aanroepende DLL worden geïnstalleerd en moet code worden gebruikt die vergelijkbaar is met de LoadDLL van DbgHelp.