在运行MFC程序的Release版本时,断点断在"INT_PTR nResponse = dlg.DoModal();"这句话上的处理

今天在运行Release版本程序时,发现如图显示的错误


经过调试发现,会断在"INT_PTR nResponse = dlg.DoModal();"再经过F11进入代码内部,发现,是断在了"CreateDlgIndirect"这个函数里面。

从网上查阅资料,找到了解决方法。

自己便整理了错误原因。

这个"CreateDlgIndirect"这个函数做了好多事情,包括:创建对话框的预处理。

借用MFC代码中的注释来说
明吧(以下代码摘自MFC):
#ifndef _AFX_NO_OCC_SUPPORT
        // separately create OLE controls in the dialog template
        if (pOccManager != NULL)
        {
            if (!SetOccDialogInfo(&occDialogInfo))
                return FALSE;

            lpDialogTemplate = pOccManager->PreCreateDialog(&occDialogInfo,
                lpDialogTemplate);
        }

        if (lpDialogTemplate == NULL)
            return FALSE;
#endif //!_AFX_NO_OCC_SUPPORT
意思是:对话框模板中的OLE控件要分离出来然后创建。


经过调试之后,发现因为在代码中添加了ActiveX控件,确没有用到。所有果断的删去了。

结论:

在动态库dll中生成对话框,如果其中包括了ActiveX控件,在创建对话框失败时,需要考虑在CApp::InitInstance()中添加以下语句

OleInitialize(NULL) & AfxEnableControlContainer()

动态加载GIF动画 VC 实现 include "stdafx.h" #include "TransparentGif.h" #include "TransparentGifDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CTransparentGifApp BEGIN_MESSAGE_MAP(CTransparentGifApp, CWinAppEx) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP() // CTransparentGifApp 构造 CTransparentGifApp::CTransparentGifApp() { // TODO: 在此处添加构造代码, // 将所有重要的初始化放置在 InitInstance 中 } // 唯一的一个 CTransparentGifApp 对象 CTransparentGifApp theApp; // CTransparentGifApp 初始化 BOOL CTransparentGifApp::InitInstance() { // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, //则需要 InitCommonControlsEx()。否则,将无法创建窗口。 INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // 将它设置为包括所有要在应用程序中使用的 // 公共控件类。 InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinAppEx::InitInstance(); AfxEnableControlContainer(); // 标准初始化 // 如果未使用这些功能并希望减小 // 最终可执行文件的大小,则应移除下列 // 不需要的特定初始化例程 // 更改用于存储设置的注册表项 // TODO: 应适当修改该字符串, // 例如修改为公司或组织名 SetRegistryKey(_T("应用程序向导生成的本地应用程序")); CTransparentGifDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此放置处理用 // “确定”来关闭对框的代码 } else if (nResponse == IDCANCEL) { // TODO: 在此放置处理用 // “取消”来关闭对框的代码 } // 由于对框已关闭,所以将返回 FALSE 以便退出应用程序, // 而不是启动应用程序的消息泵。 return FALSE; }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值