Aracılığıyla paylaş


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 HINSTANCEFARPROC). 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 dliStartProcessingkanca 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 dliNotePreLoadLibrarykanca 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 dliNotePreGetProcAddresskanca 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 dliNoteEndProcessingkanca 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 HINSTANCEFARPROC) 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ı GetLastErroriçin gerekli olan tüm verileri ve değerini içerir.

Bildirim ise dliFailLoadLibkanca 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 dliFailGetProckanca 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.

Ayrıca bkz.

Gecikmeli yüklenen DLL'ler için bağlayıcı desteği