查看: 2524|回复: 7

[求助]MFC动态加载OSG,退出崩溃,两周了没搞定,小弟先谢谢了

[复制链接]

该用户从未签到

发表于 2013-3-20 17:19:18 | 显示全部楼层 |阅读模式
本帖最后由 servicebbs 于 2013-3-20 17:23 编辑

问题:
1.把运行osg的代码封装为osg.dll。
2.在MFC单文档程序中以动态加载的方式(LoadLibraryEx)加载osg.dll
3.调用osg.dll中接口,使osg运行起来,显示模型,到此运行没有任何问题。
4.点击关闭MFC程序,这时程序出错。(例如:MFC.exe 中的 0x77d915de 处有未经处理的异常: 0xC0000005: Access violation),崩溃于afxframewndex.cpp文件的599行。

请问各位是为什么啊???搞了好久搞不定!!!
帖子附工程源代码,各位看贴辛苦了,谢谢。

--------------------------------------------
后来发现把OnDestroy() 中的FreeLibrary(mInst); 移到~CMFCView()函数中,退出则没有问题了。可是我们项目比较复杂,目前做这么点改变非常困难,否则我也就不麻烦大家了,请各位解答一下,为什么会崩溃啊??????

osg.dll工程:
1.新建空工程osg,修改配置类型为.dll
2.拷贝OpensceneGraph 3.0.1中例子Examples osgviewerMFC中的MFC_OSG.h和MFC_OSG.cpp到工程中
3.在MFC_OSG.cpp中添加如下代码
  1. #  if defined( OSG_LIBRARY )
  2. #    define OSG_EXPORT   __declspec(dllexport)
  3. #  else
  4. #    define OSG_EXPORT   __declspec(dllimport)
  5. #  endif

  6. cOSG* mOSG = NULL;
  7. HANDLE mThreadHandle;

  8. extern "C" void OSG_EXPORT start(LONG_PTR window) throw()
  9. {
  10.         mOSG = new cOSG((HWND)window);
  11.         mOSG->InitOSG(std::string("osgcool.osgt"));
  12.         mThreadHandle = (HANDLE)_beginthread(&cOSG::Render, 0, mOSG);
  13. }

  14. extern "C" void OSG_EXPORT end(void) throw()
  15. {
  16.         if(mOSG != 0) delete mOSG;

  17. }
复制代码
MFC.exe工程:
在MFC类向导生成的MFCView.cpp添加下如代码:
  1. typedef void (*DLL_START_PLUGIN)(LONG_PTR);
  2. typedef void (*DLL_END_PLUGIN)(void);
  3. HINSTANCE mInst;
  4. DLL_START_PLUGIN pFuncStart;
  5. DLL_END_PLUGIN pFuncEnd;

  6. void CMFCView::OnInitialUpdate()
  7. {
  8.         CView::OnInitialUpdate();

  9.         // TODO: 在此添加专用代码和/或调用基类
  10.         mInst = (HINSTANCE)LoadLibraryEx( _T("osg.dll"), NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
  11.         pFuncStart = (DLL_START_PLUGIN)GetProcAddress(mInst, ("start"));
  12.         if (pFuncStart)
  13.         {
  14.                 pFuncStart((LONG_PTR)m_hWnd);
  15.         }
  16. }


  17. void CMFCView::OnDestroy()
  18. {
  19.         if (mInst)
  20.         {
  21.                 pFuncEnd = (DLL_END_PLUGIN)GetProcAddress(mInst, ("end"));
  22.                 if (pFuncEnd)
  23.                 {
  24.                         pFuncEnd();
  25.                 }
  26.         }
  27.         FreeLibrary(mInst);

  28.         CView::OnDestroy();

  29.         // TODO: 在此处添加消息处理程序代码
  30. }
复制代码

MfcOsgError.rar

93.33 KB, 下载次数: 12, 下载积分: 威望 1

该用户从未签到

发表于 2013-3-21 08:28:28 | 显示全部楼层
不知道是不是thread那里的问题,可以参照osgMFC中的实现方式

该用户从未签到

 楼主| 发表于 2013-3-21 09:26:34 | 显示全部楼层
liuzhiyu123 发表于 2013-3-21 08:28
不知道是不是thread那里的问题,可以参照osgMFC中的实现方式

感谢回复
mThreadHandle = (HANDLE)_beginthread(&cOSG::Render, 0, mOSG);
这句注释掉还是会出错,这里基本都是按照osgMFC来实现的,只是单独封装成DLL,如果改用静态链接也不会有问题。

我就是想不明白,在OnDestroy时,我把该析构,该删除的都处理了,只是没有释放DLL,为什么调用窗口的Destroy时还会崩溃,这时的DLL应该和MFC窗口无关了啊

该用户从未签到

 楼主| 发表于 2013-3-21 17:30:31 | 显示全部楼层
各位帮帮忙了,数组哥~~~~

该用户从未签到

 楼主| 发表于 2013-3-22 17:08:38 | 显示全部楼层
帮帮忙啊

该用户从未签到

发表于 2013-3-25 09:27:57 | 显示全部楼层
这个您只能自己调试堆栈找到出错的位置了

该用户从未签到

发表于 2013-3-25 09:44:05 | 显示全部楼层
为什么要起这样一个名字osg.dll?请你注意到,osg的核心库的名称也叫osg.dll,并且你自己写的函数库与osg的函数库在应用程序运行的时候都能够被搜索到,导致函数库的加载错误呢???
建议你把你的工程改个名字吧,不要和osg中的函数库名称发生冲突行了吧...

该用户从未签到

 楼主| 发表于 2013-3-25 10:06:55 | 显示全部楼层
谢谢各位,我的osg核心库叫osg80-osg.dll,这个是我为了说明问题,举的例子,改成了别的名还是一样的问题


有没有兄弟碰到过这个问题?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表