调用test1.dll,test1.dll依赖于test2.dll,test1.dll存在,test2.dll不存在
代码如下:
#include <windows.h>
#include <stdio.h>void main()
{
const char *path = "C:\\test1.dll";
try{
handle = LoadLibrary(path);
}catch(...){
}
printf("after load library");
}
执行时windows弹出对话框,提示无法找到test2.dll
控制台输出了after load library
请问能捕获windows抛出的异常吗
代码如下:
#include <windows.h>
#include <stdio.h>void main()
{
const char *path = "C:\\test1.dll";
try{
handle = LoadLibrary(path);
}catch(...){
}
printf("after load library");
}
执行时windows弹出对话框,提示无法找到test2.dll
控制台输出了after load library
请问能捕获windows抛出的异常吗
如果返回NULL。则说明加载DLL失败,原因很多。也不一定是上面的原因
请高手指教!
FindFile
有就调用
下面是例子,目标dll是DelayLoadDLL.dll,调用函数是foo#pragma comment( lib, "DELAYIMP.LIB" )#pragma comment(linker, "/DELAYLOAD:DelayLoadDLL.dll")
#pragma comment(linker, "/DELAY:nobind ")
#pragma comment(linker, "/DELAY:unload ")#pragma comment( lib, "..\\DelayLoadDLL\\Release\\DelayLoadDLL.lib" )
调用的时候
__try
{
foo();
__FUnloadDelayLoadedDLL("DelayLoadDLL.dll");
}
__except (DelayLoadDllExceptionFilter(GetExceptionInformation()))
{
}异常处理:
LONG WINAPI DelayLoadDllExceptionFilter(PEXCEPTION_POINTERS pep)
{
LONG lDisposition = EXCEPTION_EXECUTE_HANDLER;
PDelayLoadInfo pdli = PDelayLoadInfo(pep->ExceptionRecord
->ExceptionInformation[0]);
char sz[500] = { 0 };
switch (pep->ExceptionRecord->ExceptionCode)
{
case VcppException(ERROR_SEVERITY_ERROR, ERROR_MOD_NOT_FOUND):
wsprintf(sz, "Dll not found: %s", pdli->szDll);
break;
case VcppException(ERROR_SEVERITY_ERROR, ERROR_PROC_NOT_FOUND):
if (pdli->dlp.fImportByName)
{
wsprintf(sz, "Function %s was not found in %s",
pdli->dlp.szProcName, pdli->szDll);
}
else
{
wsprintf(sz, "Function ordinal %d was not found in %s",
pdli->dlp.dwOrdinal, pdli->szDll);
}
break;
default:
lDisposition = EXCEPTION_CONTINUE_SEARCH;
break;
}
if (lDisposition == EXCEPTION_EXECUTE_HANDLER)
{
MessageBox(NULL, sz, NULL, MB_OK);
}
return(lDisposition);
}msdn里Jeffrey Richter有关于该技术的一篇文章.