Hata işleme ve bildirme
Programınız gecikmeli yüklenen DLL'ler kullanıyorsa, program çalışırken oluşan hatalar işlenmeyen özel durumlara neden olacağından hataları sağlam bir şekilde işlemelidir. Hata işleme iki kısımdan oluşur: Kanca üzerinden kurtarma ve özel durum aracılığıyla raporlama.
DLL gecikme yükü hata işleme ve bildirimi hakkında daha fazla bilgi için bkz . Yardımcı işlevi anlama.
Kanca işlevleri hakkında daha fazla bilgi için bkz . Yapı ve sabit tanımlar.
Kanca aracılığıyla kurtarma
Kodunuzun bir hata durumunda kurtarılması veya alternatif bir kitaplık veya yordam sağlaması gerekebilir. Yardımcı işleve alternatif kodu sağlayabilecek veya durumu düzeltebilecek bir kanca sağlayabilirsiniz. İşlemenin devam edebilmesi için kanca yordamının uygun bir değer döndürmesi gerekir (veya HINSTANCE
FARPROC
). Ya da bir özel durumun atılması gerektiğini belirtmek için 0 döndürebilir. Ayrıca kendi özel durumunu veya longjmp
kancadan atabilir. Bildirim kancaları ve hata kancaları vardır. Aynı yordam her ikisi için de kullanılabilir.
Bildirim kancaları
Gecikme yükü bildirim kancaları yardımcı yordamında aşağıdaki eylemler gerçekleştirilmeden hemen önce çağrılır:
Kitaplığın depolanmış tanıtıcısı, zaten yüklenip yüklenmediğini görmek için denetlendi.
LoadLibrary
dll dosyasının yüklenmesini denemesi için çağrılır.GetProcAddress
, yordamın adresini almaya çalışmak için çağrılır.Gecikmeli içeri aktarma yüküne geri dönün.
Bildirim kancası etkin:
Bildirimleri alan kendi işlevinizi işaret etmek için başlatılan işaretçinin
__pfnDliNotifyHook2
yeni bir tanımını sağlayarak.-veya-
programın yüklenmesini geciktirdiği DLL çağrısından önce işaretçiyi
__pfnDliNotifyHook2
kanca işlevinize ayarlayarak.
Bildirim ise dliStartProcessing
kanca işlevi şunları döndürebilir:
NULL
Varsayılan yardımcı, DLL'nin yüklenmesini işler. Yalnızca bilgilendirme amacıyla arama yapmak yararlıdır.
işlev işaretçisi
Varsayılan gecikme yükü işlemeyi atla. Kendi yük işleyicinizi sağlamanıza olanak tanır.
Bildirim ise dliNotePreLoadLibrary
kanca işlevi şunları döndürebilir:
0, yalnızca bilgilendirme bildirimleri istiyorsa.
HMODULE
Dll'nin kendisini yüklediyse, yüklenen DLL için.
Bildirim ise dliNotePreGetProcAddress
kanca işlevi şunları döndürebilir:
0, yalnızca bilgilendirme bildirimleri istiyorsa.
Kanca işlevi adresi alırsa içeri aktarılan işlevin adresi.
Bildirim ise dliNoteEndProcessing
kanca işlevinin dönüş değeri yoksayılır.
Bu işaretçi başlatılırsa (sıfır olmayan), gecikme yükü yardımcı işlevi yürütmesi boyunca belirli bildirim noktalarında çağırır. İşlev işaretçisi aşağıdaki tanıma sahiptir:
// The "notify hook" gets called for every call to the
// delay load helper. This allows a user to hook every call and
// skip the delay load helper entirely.
//
// dliNotify == {
// dliStartProcessing |
// dliNotePreLoadLibrary |
// dliNotePreGetProc |
// dliNoteEndProcessing}
// on this call.
//
ExternC
PfnDliHook __pfnDliNotifyHook2;
// This is the failure hook, dliNotify = {dliFailLoadLib|dliFailGetProc}
ExternC
PfnDliHook __pfnDliFailureHook2;
Bildirimler, bildirim değeriyle birlikte kanca işlevine bir DelayLoadInfo
yapı geçirir. Bu veriler gecikme yükü yardımcı yordamı tarafından kullanılan veri ile aynıdır. Bildirim değeri, Yapı ve sabit tanımlarda tanımlanan değerlerden biri olacaktır.
Hata kancaları
Hata kancası, bildirim kancası ile aynı şekilde etkinleştirilir. İşlemenin devam edebilmesi için kanca yordamının uygun bir değer döndürmesi gerekir (veya HINSTANCE
FARPROC
) veya özel durum oluşturulabileceğini belirtmek için 0.
Kullanıcı tanımlı işleve başvuran işaretçi değişkeni:
// This is the failure hook, dliNotify = {dliFailLoadLib|dliFailGetProc}
ExternC
PfnDliHook __pfnDliFailureHook2;
Yapısı, DelayLoadInfo
hatanın ayrıntılı olarak raporlanması GetLastError
için gerekli olan tüm verileri ve değerini içerir.
Bildirim ise dliFailLoadLib
kanca işlevi şunları döndürebilir:
0, hatayla başa çıkamıyorsa.
Hata kancası sorunu düzeltip kitaplığın kendisini yüklediyse, bir
HMODULE
.
Bildirim ise dliFailGetProc
kanca işlevi şunları döndürebilir:
0, hatayla başa çıkamıyorsa.
Hata kancası adresin kendisini almada başarılı olduysa geçerli bir proc adresi (işlev adresini içeri aktar).
Özel durum kullanarak rapor oluşturma
Hatayı işlemek için gereken tek şey yordamı durdurmaksa, kullanıcı kodu özel durumu işleyebildiği sürece kanca gerekmez.
Gecikme yükü özel durum kodları
Gecikmeli yükleme sırasında hatalar oluştuğunda yapılandırılmış özel durum kodları oluşturulabilir. Özel durum değerleri bir VcppException
makro kullanılarak belirtilir:
//
// Exception information
//
#define FACILITY_VISUALCPP ((LONG)0x6d)
#define VcppException(sev,err) ((sev) | (FACILITY_VISUALCPP<<16) | err)
Bir LoadLibrary
hata için standart VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND)
oluşturulur. Bir GetProcAddress
hata için, atılan hata şeklindedir VcppException(ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND)
. Özel durum, bir yapıya DelayLoadInfo
bir işaretçi geçirir. LPDWORD
Tarafından yapıdan EXCEPTION_RECORD
alınan GetExceptionInformation
değerde, alanındadırExceptionInformation[0]
.
Alanda yanlış bitler ayarlanırsa grAttrs
, özel durum ERROR_INVALID_PARAMETER
oluşturulur. Bu özel durum, tüm amaçlar ve amaçlar için önemlidir.
Daha fazla bilgi için bkz . Yapı ve sabit tanımlar.