调用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抛出的异常吗

解决方案 »

  1.   

    判断LoadLibrary的返回值。 WIN32API函数是不会抛出异常的。
    如果返回NULL。则说明加载DLL失败,原因很多。也不一定是上面的原因
      

  2.   

    我程序执行的结果是返回了null,并且抛出了异常对话框,弹出异常的原因肯定是我上面说的原因.因为我将handle  =  LoadLibrary(path);  改成了handle = LoadLibraryEx(path,NULL,DONT_RESOLVE_DLL_REFERENCES);就不会出错了,因为DONT_RESOLVE_DLL_REFERENCES选项的含义是不载入该dll所依赖的dll.但这样不能解决问题.
    请高手指教!
      

  3.   

    先判断DLL文件是否存在
    FindFile
    有就调用
      

  4.   

    Windows的系统调用是不会抛异常的,异常只是C++的语言支持,和windows没有关系,windows给出的对话框是windows想提示你,不是异常处理。你要知道动态库装载失败的原因干什么?为什么要把test2.dll和test.dll联系那么紧呢,不能在test.dll装载完后用LoadLibray("test2.dll")装载吗?起码可以用test.dll中和test2.dll无关的部分啊。
      

  5.   

    使用DelayLoad技术。
    下面是例子,目标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有关于该技术的一篇文章.