|
本帖最后由 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中添加如下代码- # if defined( OSG_LIBRARY )
- # define OSG_EXPORT __declspec(dllexport)
- # else
- # define OSG_EXPORT __declspec(dllimport)
- # endif
- cOSG* mOSG = NULL;
- HANDLE mThreadHandle;
- extern "C" void OSG_EXPORT start(LONG_PTR window) throw()
- {
- mOSG = new cOSG((HWND)window);
- mOSG->InitOSG(std::string("osgcool.osgt"));
- mThreadHandle = (HANDLE)_beginthread(&cOSG::Render, 0, mOSG);
- }
- extern "C" void OSG_EXPORT end(void) throw()
- {
- if(mOSG != 0) delete mOSG;
- }
复制代码 MFC.exe工程:
在MFC类向导生成的MFCView.cpp添加下如代码:- typedef void (*DLL_START_PLUGIN)(LONG_PTR);
- typedef void (*DLL_END_PLUGIN)(void);
- HINSTANCE mInst;
- DLL_START_PLUGIN pFuncStart;
- DLL_END_PLUGIN pFuncEnd;
- void CMFCView::OnInitialUpdate()
- {
- CView::OnInitialUpdate();
- // TODO: 在此添加专用代码和/或调用基类
- mInst = (HINSTANCE)LoadLibraryEx( _T("osg.dll"), NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
- pFuncStart = (DLL_START_PLUGIN)GetProcAddress(mInst, ("start"));
- if (pFuncStart)
- {
- pFuncStart((LONG_PTR)m_hWnd);
- }
- }
- void CMFCView::OnDestroy()
- {
- if (mInst)
- {
- pFuncEnd = (DLL_END_PLUGIN)GetProcAddress(mInst, ("end"));
- if (pFuncEnd)
- {
- pFuncEnd();
- }
- }
- FreeLibrary(mInst);
- CView::OnDestroy();
- // TODO: 在此处添加消息处理程序代码
- }
复制代码 |
|