我要发帖 回复

正式会员

4

主题

87

积分

0

专家分

兴趣点(最多三项):

视景仿真

私信
发表时间 : 2015-3-23 16:35:44 | 浏览 : 4718    评论 : 17
紧急求助!MFC对话框中嵌入Vega Prime出现访问冲突问题!
软件版本为Vega Prime 5.0,VS2008。
程序基于MFC对话框编写,编译无错误,执行到vp::initialize(__argc, __argv)时,出现访问冲突错误,0x101 a017e (vsgu5D.dll) 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突 。
代码按照《Vega Prime实时三维虚拟现实开发技术》实例编写,具体如下:

PublicMember.h

//

// This file was automatically generated from E:/VegaPrime_Desktop_Tutoria/myVega.acf

//

#include "vpModule.h"

#include "vpKernel.h"

#include "vpSearchPath.h"

#include "vpPipeline.h"

#include "vpWindow.h"

#include "vpChannel.h"

#include "vpObserver.h"

#include "vpScene.h"

#include "vpObject.h"

#include "vpRecyclingService.h"

#include "vpEnvGlobals.h"

#include "vpEnv.h"

#include "vpEnvSun.h"

#include "vpEnvMoon.h"

#include "vpEnvSkyDome.h"

#include "vpEnvCloudLayer.h"

#include "vpEnvStars.h"

#include "vpEnvWind.h"

#include "vpMotionUFO.h"

#include "vpApp.h"

typedef vuVector< vuField< vuBase* > > InstancesList;

#pragma once

class PublicMember

{

public:

    PublicMember(void);

    ~PublicMember(void);

    //运动场景配置

    static void CTS_Define(void);

    //VP主线程

    static UINT CTS_RunBasicThread(LPVOID);

    //场景窗口句柄

    static HWND CTS_RunningWindow;

    //控制VP线程运行的变量

    static bool CTS_continueRunVP;

    //VP线程变量

    static CWinThread * CTS_vegaThread;

    //VP对象容器

   static InstancesList* CTS_s_pInstancesToUnref;

    //VP对象文件路径

    static vpSearchPath * CTS_pSearchPath_mySearchPath;

    //VP场景对象

    static vpScene* CTS_pScene_myScene;

};

PublicMember.cpp

#include "StdAfx.h"

#include "PublicMember.h"

//场景窗口句柄

HWND PublicMember::CTS_RunningWindow=NULL;

//控制VP线程运行的变量

bool PublicMember::CTS_continueRunVP=NULL;

//VP线程变量

CWinThread* PublicMember::CTS_vegaThread=NULL;

//VP对象容器

InstancesList* PublicMember::CTS_s_pInstancesToUnref=NULL;

//VP对象文件路径

vpSearchPath* PublicMember::CTS_pSearchPath_mySearchPath=NULL;

//VP场景对象

vpScene* PublicMember::CTS_pScene_myScene=NULL;

/*******************************************

公共成员函数

包含主要的公共函数

******************************************/

PublicMember::PublicMember(void)

{

}

PublicMember::~PublicMember(void)

{

}

//运动场景配置函数

void PublicMember::CTS_Define(void)

{

    PublicMember::CTS_s_pInstancesToUnref=new InstancesList;

    //初始化各模块

    //建立各种实例

    //配置对象及实例

}

UINT PublicMember::CTS_RunBasicThread(LPVOID)

{

    //初始化

    vp::initialize(__argc,__argv);

    //定义场景

    PublicMember::CTS_Define();

    //绘制场景

    vpKernel::instance()->configure();

    //设置窗体

    vpWindow* vpWin=*vpWindow::begin();

    vpWin->setParent(PublicMember::CTS_RunningWindow);

    vpWin->setBorderEnable(false);

    vpWin->setFullScreenEnable(true);

    vpWin->open();

    //帧循环

    while(vpKernel::instance()->beginFrame()!=0)

    {

        vpKernel::instance()->endFrame();

        if(!PublicMember::CTS_continueRunVP)

        {

            vpKernel::instance()->unconfigure();

            vp::shutdown();

            return 0;

        }

    }

    return 0;

}

//在Dlg中运行Vega Prime
void CVPtestDlg::OnBnClickedbtrun()
{
        // TODO: 在此添加控件通知处理程序代码
        CWnd* pWnd = GetDlgItem(IDC_grScene);             //获取分组框句柄
        PublicMember::CTS_RunningWindow = pWnd->GetSafeHwnd();         //赋值给场景窗口句柄
        //允许帧循环
        PublicMember::CTS_continueRunVP = true;
        PublicMember::CTS_vegaThread = AfxBeginThread(PublicMember::CTS_RunBasicThread,this);           //启动VP线程主函数
}


最近VR访客查看更多↓

kangaroo 评论于2015-3-24 10:54:29
软件注册了吗?
     探索视景仿真之发展,超越自我!
sichuanwww 评论于2015-3-24 15:03:33
kangaroo 发表于 2015-3-24 10:54 AM
软件注册了吗?

(__argc, __argv)    这个是两根下滑线,英文输入法下的。
努力挣钱,快乐生活!
onionor 评论于2015-3-24 22:46:01
kangaroo 发表于 2015-3-24 10:54 AM
软件注册了吗?

两个软件都已注册
onionor 评论于2015-3-24 22:52:15
sichuanwww 发表于 2015-3-24 03:03 PM
(__argc, __argv)    这个是两根下滑线,英文输入法下的。

两个参数的输入均没有问题。在网上搜索到遇到相似问题的人,
http://zhidao.baidu.com/link?url=SuSYKjnppJEn5P7u66iGL0sf7qnOQ9jUhI8GiX8h6J1volAe0yXacVwp7_iNxRkIXxTh6ARujMP55P7tGuMCxa
貌似是多线程方面的问题,但均未解决。
在控制台程序中调试VP程序均未出现问题。
只有在MFC中编译ACF生成的代码就会出现问题,直接调用ACF文件却没有错误。
sichuanwww 评论于2015-3-25 08:45:12
本帖最后由 sichuanwww 于 2015-3-25 08:49 AM 编辑
onionor 发表于 2015-3-24 10:52 PM
两个参数的输入均没有问题。在网上搜索到遇到相似问题的人,
http://zhidao.baidu.com/link?url=SuSYKjnp ...

那肯定是指针的问题,你找找我写的VP5的那个例子。我调试通过的。

http://www.52vr.com/bbs/forum.ph ... 7&highlight=vp5
努力挣钱,快乐生活!
onionor 评论于2015-3-25 17:25:12
sichuanwww 发表于 2015-3-25 08:45 AM
那肯定是指针的问题,你找找我写的VP5的那个例子。我调试通过的。

http://www.52vr.com/bbs/forum.php?mo ...

已解决,过程很诡异,我查看vsgu5D.dll输出库函数地址位置时,加了行代码
DWORD addtr = (DWORD)GetProcAddress(LoadLibrary("vsgu5D.dll"),(LPCSTR)"initialize");
结果程序自己就好了,注释掉GetProcAddress后,依然正常运行。
还有个问题,为何要采用多线程 DLL (/MD)模式,而不是多线程调试 DLL (/MDd)模式。
david_m 评论于2015-3-26 19:17:23
onionor 发表于 2015-3-25 05:25 PM
已解决,过程很诡异,我查看vsgu5D.dll输出库函数地址位置时,加了行代码
DWORD addtr = (DWORD)GetProcA ...

这应该不是重点。
勤省,笃学,自强
onionor 评论于2015-3-29 16:22:03
david_m 发表于 2015-3-26 07:17 PM
这应该不是重点。

我觉得也是,这个问题就是那样解决的,莫名其妙。
照着书学习仿真调试,问题多多。
k72550 评论于2015-4-21 19:28:16
onionor 发表于 2015-3-29 04:22 PM
我觉得也是,这个问题就是那样解决的,莫名其妙。
照着书学习仿真调试,问题多多。 ...

请问楼主用的那本书?
依然很准 评论于2015-7-3 20:31:44
我也遇到了同样的问题,但是C++基础又比较差,不知道怎么解决了,楼主有什么解决办法吗
jsk洛 评论于2018-4-23 16:16:27
依然很准 发表于 2015-7-3 08:31 PM
我也遇到了同样的问题,但是C++基础又比较差,不知道怎么解决了,楼主有什么解决办法吗 ...

我最近也是遇到了这个问题,正在忙于解决,稍后回复
sichuanwww 评论于2018-4-24 15:18:50
jsk洛 发表于 2018-4-23 04:16 PM
我最近也是遇到了这个问题,正在忙于解决,稍后回复

推荐使用release版本,不使用debug版本
努力挣钱,快乐生活!
jsk洛 评论于2018-4-25 09:08:27
sichuanwww 发表于 2018-4-24 03:18 PM
推荐使用release版本,不使用debug版本

无差,结果依然。。。。
sichuanwww 评论于2018-4-25 09:34:13
jsk洛 发表于 2018-4-25 09:08 AM
无差,结果依然。。。。

vs2008 sp1
努力挣钱,快乐生活!
jsk洛 评论于2018-4-25 09:49:12

补丁略大,回去再下。感谢大大~~
sichuanwww 评论于2018-4-25 11:09:46
jsk洛 发表于 2018-4-25 09:49 AM
补丁略大,回去再下。感谢大大~~

开始都是问题多多,熟练了就好了。
努力挣钱,快乐生活!
jsk洛 评论于2018-5-2 09:19:58
sichuanwww 发表于 2018-4-25 11:09 AM
开始都是问题多多,熟练了就好了。

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-12-8 02:25 AM

返回顶部