Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
DbgHelp.dll Windows'un tüm sürümleriyle birlikte gelse de, arayanlar Windows için Hata Ayıklama Araçları paketinde bulunan bu DLL'nin en son sürümlerinden birini kullanmayı düşünmelidir. DbgHelp dağıtımıyla ilgili ayrıntılar için bkz. DbgHelp Sürümleri.
DbgHelp kullanırken en iyi strateji, windows için hata ayıklama araçları paketi nden kitaplığın bir kopyasını çağıran yazılıma mantıksal olarak bitişik uygulama dizinine yüklemektir. Sembol Sunucusu ve Kaynak Sunucu da gerekiyorsa, hem SymSrv.dll hem de SrcSrv.dll DbgHelp.dllile aynı dizine yüklenmelidir. DbgHelp bu DLL'leri yalnızca aynı dizini paylaştığında çağırır. (DbgHelp'in bu iki DLL'yi standart arama yolundan çağırmayacağını unutmayın.) Bu, eşleşmeyen DLL'lerin kullanımını önlemeye yardımcı olur; benzer şekilde, genel olarak güvenliği de artırır.
Aşağıdaki kod DbgHelp kaynağından ayıklanır. DbgHelp'in, SymSrv.dll ve SrcSrv.dll sürümlerini yalnızca DbgHelp.dll'nin bulunduğu dizinden nasıl yüklediğini gösterir.
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;
}
Bu iki DLL'yi yükledikten sonra DbgHelp, ihtiyaç duyduğu işlevleri almak için GetProcAddressçağırır.
Normalde, DbgHelp.dll çağıran kod, geçerli işlemi başlatan uygulamayla aynı dizine DbgHelp.dll yükleyerek doğru sürümün yüklenmesini sağlar. Çağıran kod bir DLL'deyse ve başlangıçtaki işlemin yerini bilmiyorsa veya bu yere erişimi yoksa, DbgHelp.dll çağıran DLL ile birlikte yüklenmeli ve DbgHelp'in LoadDLL işlevine benzer bir kod kullanılmalıdır.