static LONG WINAPI DelayLoadDllExceptionFilter(PEXCEPTION_POINTERS pExcPointers, wxString *err) { LONG lDisposition = EXCEPTION_EXECUTE_HANDLER; PDelayLoadInfo pdli = PDelayLoadInfo(pExcPointers->ExceptionRecord->ExceptionInformation[0]); switch (pExcPointers->ExceptionRecord->ExceptionCode) { case VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND): { // ASICamera2.dll depends on the VC++ 2008 runtime, check for that HMODULE hm = LoadLibraryEx(_T("MSVCR90.DLL"), NULL, LOAD_LIBRARY_AS_DATAFILE); if (hm) { FreeLibrary(hm); *err = wxString::Format(_("Could not load DLL %s"), pdli->szDll); } else *err = _("The ASI camera library requires the Microsoft Visual C++ 2008 Redistributable Package (x86), available at http://www.microsoft.com/en-us/download/details.aspx?id=29"); break; } case VcppException(ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND): if (pdli->dlp.fImportByName) *err = wxString::Format("Function %s was not found in %s", pdli->dlp.szProcName, pdli->szDll); else *err = wxString::Format("Function ordinal %d was not found in %s", pdli->dlp.dwOrdinal, pdli->szDll); break; default: // Exception is not related to delay loading lDisposition = EXCEPTION_CONTINUE_SEARCH; break; } return lDisposition; }
LONG g_exception_filter_delay_load(PEXCEPTION_POINTERS pExcPointers) { LONG lDisposition = EXCEPTION_EXECUTE_HANDLER; PDelayLoadInfo pDelayLoadInfo = PDelayLoadInfo(pExcPointers->ExceptionRecord->ExceptionInformation[0]); switch (pExcPointers->ExceptionRecord->ExceptionCode) { case VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND): break; case VcppException(ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND): break; default: lDisposition = EXCEPTION_CONTINUE_SEARCH; break; } return(lDisposition); }