查看: 2122|回复: 4

OSG程序无法运行

[复制链接]

该用户从未签到

发表于 2009-2-27 10:09:09 | 显示全部楼层 |阅读模式
我有一个OSG的程序,平台是VS 2005,使用了MFC的框架,编译和链接都是正确的(include和lib的目录都设置正确,另外,在配置属性中设置"使用MFC"为“在共享 DLL 中使用 MFC”以及"运行时库"为“多线程 DLL (/MD)”),release下和debug下(分别按要求设置附加依赖库)都试过,程序总是跑不起来(什么窗口也没有出现,资源管理器中CPU为100%,内存到达一定量时不再增加(约二三十兆时))。我试过一些简单的基于windows控制台应用程序的OSG程序,运行没有问题。我设置断点,试着跟踪了一下,发现问题出在了MFC的应用程序类的实例化上,程序运行到CRambleSystemApp::InitInstance()中的“if (!ProcessShellCommand(cmdInfo))return FALSE;”处断点便不再执行了。我知道这是MFC封装的一个处理命令行的函数,但具体的功能不是很清楚。我试过其他基于MFC的程序,当程序执行完这句话后,应该立刻生成一个应用程序的窗口。所以,不知道哪位大侠能帮我分析一下可能的原因,到底是OSG的原因还是MFC的原因,或是工程属性设置的问题。不甚感激!

该用户从未签到

发表于 2009-2-27 10:40:38 | 显示全部楼层
也许最好能看到您的工程和代码文件,不然恐怕很难分析问题的所在;又或者恰好有朋友遇到过类似的问题,可以凭空解答一下?

该用户从未签到

 楼主| 发表于 2009-2-28 19:10:00 | 显示全部楼层

回复 2楼 的帖子

怎么说呢,实际上问题是这样的:程序原本是另外一位人写的,在他自己的笔记本上是能够正常运行的。由于某种原因,现在需要我接着继续做(需要增加一些功能)。于是,他把源程序打包并发给我。我运行时就出现了上述现象。由于那人和我不在同一个地方,我们只能通过QQ交流讨论,但是,他试想了各种可能的原因,并且尝试教我去修改各种设置,都没有成功。最终,他也想不出到底是怎么一回事。关于代码,我可以粘贴一部分,是应用程序类的实例化函数,如下:
BOOL CRambleSystemApp::InitInstance()
{
        AfxOleInit();
        // 如果一个运行在 Windows XP 上的应用程序清单指定要
        // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
        //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
        INITCOMMONCONTROLSEX InitCtrls;
        InitCtrls.dwSize = sizeof(InitCtrls);
        // 将它设置为包括所有要在应用程序中使用的
        // 公共控件类。
        InitCtrls.dwICC = ICC_WIN95_CLASSES;
        InitCommonControlsEx(&InitCtrls);

        CWinApp::InitInstance();

        // 标准初始化
        // 如果未使用这些功能并希望减小
        // 最终可执行文件的大小,则应移除下列
        // 不需要的特定初始化例程
        // 更改用于存储设置的注册表项
        // TODO: 应适当修改该字符串,
        // 例如修改为公司或组织名
        OpenDatabase("数据库.mdb");
        SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
        LoadStdProfileSettings(4);  // 加载标准 INI 文件选项(包括 MRU)
        // 注册应用程序的文档模板。文档模板
        // 将用作文档、框架窗口和视图之间的连接
        CSingleDocTemplate* pDocTemplate;
        pDocTemplate = new CSingleDocTemplate(
                IDR_MAINFRAME,
                RUNTIME_CLASS(CRambleSystemDoc),
                RUNTIME_CLASS(CMainFrame),       // 主 SDI 框架窗口
                RUNTIME_CLASS(CRambleSystemView));
        if (!pDocTemplate)
                return FALSE;
        AddDocTemplate(pDocTemplate);


        // 启用“DDE 执行”
        EnableShellOpen();
        RegisterShellFileTypes(TRUE);

        // 分析标准外壳命令、DDE、打开文件操作的命令行
        CCommandLineInfo cmdInfo;
        ParseCommandLine(cmdInfo);


        // 调度在命令行中指定的命令。如果
        // 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
        if (!ProcessShellCommand(cmdInfo))
                return FALSE;

        // 唯一的一个窗口已初始化,因此显示它并对其进行更新
        m_pMainWnd->ShowWindow(3);
        m_pMainWnd->UpdateWindow();
        m_pMainWnd->SetWindowTextA("####标题####");
        // 仅当具有后缀时才调用 DragAcceptFiles
        //  在 SDI 应用程序中,这应在 ProcessShellCommand  之后发生
        // 启用拖/放
        m_pMainWnd->DragAcceptFiles();
        return TRUE;
}
不管是猜测还是凭空解答,也不管是不是能解决问题,我都非常感激!

[ 本帖最后由 Guogenhua 于 2009-2-28 19:11 编辑 ]

该用户从未签到

发表于 2009-2-28 20:38:11 | 显示全部楼层
我以前好像也碰到过类似的问题,就是在MFC的内部函数停止。我把工程设置里面的生成清单文件去掉,编译一次,然后再设置回生成清单文件,然后编译就可以了。可能和你的问题不一样哈,我总觉得OSG和MFC结合有些莫名其妙的问题。

该用户从未签到

 楼主| 发表于 2009-3-2 16:14:26 | 显示全部楼层

回复 4楼 的帖子

试了一下,还是不行...不过还是很感谢你的建议!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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