有一个MFC 扩展dll,其中有一导出函数InitializeAnvilExtension,内容如下:
void WINAPI InitializeAnvilExtension()
{
    ShowMainWindow();//出现一个窗口;
}现有MFC应用程序调用这个dll,主要内容如下:         HINSTANCE  hinst=::AfxLoadLibraryEx(_T("test.dll"),NULL,DONT_RESOLVE_DLL_REFERENCES);
if(hinst !=NULL)
{
 AfxMessageBox(_T("load dll"));
 typedef  void ( *myfunc)(); //  WINAPI//   CALLBACK                 
 myfunc fun=NULL;        
         fun=(myfunc)GetProcAddress(hinst,"InitializeAnvilExtension");   
 if(fun)   
 {  
 AfxMessageBox(_T("load fun"));
 fun();
 }   
 AfxFreeLibrary(hinst);
         }
加载dll的hinst 和函数指针fun都不为空值,但是执行到 fun()时出现错误,如下:
test.exe 中的 0x800002fa 处最可能的异常: 0xC0000005: 读取位置 0x800002fa 时发生访问冲突被这个问题困扰了好几天了,郁闷~有没有人知道这个问题的解决方法~
谢谢~

解决方案 »

  1.   

    是不是fun(); 这句错了?
    应该怎么才能执行test.dll中的导出函数“InitializeAnvilExtension”?
      

  2.   

    使用简单的HINSTANCE  hinst=::LoadLibrary(); 试试看呢,看看是不是加载的问题
      

  3.   

    我看了加载dll和获得函数指针都不为空,值如下
    hinst = 0x10000000 {unused=9460301 }
    fun = 0x10001280
    我怀疑是执行函数指针fun();有问题,因为它执行完后没有执行到释放句柄AfxFreeLibrary(hinst); 
    而是又跳转到fun=(myfunc)GetProcAddress(hinst,"InitializeAnvilExtension");    这个位置,所以感觉是执行函数时出错。
    但不知道怎么改
      

  4.   

    typedef  void ( *myfunc)(); 
    这一句不对,这样定义是C调用,而DLL中是WINAPI调用,呵呵
    该知道如何改了吧
      

  5.   

    我用这个typedef  void (WINAPI *myfunc)();  试过了错误没变化。
    用这个也不行typedef  void (CALLBACK *myfunc)();  
    这个是报错的图片:
      

  6.   

    不知道你的问题解决没.
    我在编写一个将WOTRD转换为TXT文档的程序的时候也碰到了类似的问题.FindFile.exe 中的 0x7c2e7f41 (mfc71d.dll) 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突 。但是我的这个问题好象是和初始化函数AfxOleInit();有关,我在父窗体中运行就没问题,而到子窗体中运行就有访问冲突,不知道你的问题是不是也与这个有关
      

  7.   

    经过查找发现好像是dll有点问题,dll里的这个导出函数,一到第二行
    frame = new CFrameWnd();处就出现上面图里的错误。void WINAPI InitializeAnvilExtension() 

       CFrameWnd* frame = NULL;
    frame = new CFrameWnd();//错误好像就出在这里……
    CRect rect(200, 200, 600, 400);
    frame->Create(NULL, "test", WS_OVERLAPPEDWINDOW, rect, NULL);
    frame->ShowWindow(SW_SHOW); 
    } 不知道是什么原因,有人知道吗?
      

  8.   

    这是DLL资源句柄的问题。不知道你有没有注意到用向导建立“向导使用共享 MFC DLL 的规则 DLL”时在*App.cpp文件中添加的内容:
    //
    // 注意!
    //
    // 如果此 DLL 动态链接到 MFC
    // DLL,从此 DLL 导出并
    // 调入 MFC 的任何函数在函数的最前面
    // 都必须添加 AFX_MANAGE_STATE 宏。
    //
    // 例如:
    //
    // extern "C" BOOL PASCAL EXPORT ExportedFunction()
    // {
    // AFX_MANAGE_STATE(AfxGetStaticModuleState());
    // // 此处为普通函数体
    // }
    //
    // 此宏先于任何 MFC 调用
    // 出现在每个函数中十分重要。这意味着
    // 它必须作为函数中的第一个语句
    // 出现,甚至先于所有对象变量声明,
    // 这是因为它们的构造函数可能生成 MFC
    // DLL 调用。
    //
    // 有关其他详细信息,
    // 请参阅 MFC 技术说明 33 和 58。
    //
      

  9.   

    你是如何导出的,另:如果定义时使用WINAPI,请到调用时typedef  void (WINAPI *myfunc)(); 
      

  10.   

    谢谢帮忙,可是我要调用的dll是mfc扩展dll。
      

  11.   

    函数导出是在test.def文件中定义了下:
    ; test.def : Declares the module parameters for the DLL.LIBRARY      "test"EXPORTS
        ; Explicit exports can go here
    InitializeAnvilExtension @1
    是不是因为我要调用的dll缺少什么东西,所以一调用到创建窗口new CFrameWnd()就出错呢?
    因为我调用这个dll里的其他导出函数(不调用窗口,只返回字符串)就好使,没有提示过上面的错误。
    谢谢大家~再帮我看看吧>_<
      

  12.   

    我的代码下载的地址:
    http://cachefile14.fs2you.com/zh-cn/download/4a87ef889bdab4d928cefec67fffa972/%E6%98%BE%E5%BC%8F%E8%B0%83%E7%94%A8MFC%E6%89%A9%E5%B1%95dll.rarextern 是MFC扩展dll的源代码;11 是调用dll的MFC应用程序源代码