如何解决对话框退出后主程序也退出的问题

步履人生 2008-11-23 04:23:02
我用MFC Extension DLL(using shared MFC DLL)方式创建了一个dll,并且在该dll中创建了一个基于对话框的类CDoWizard并且将该类导出用于主程序,我的主程序是基于Single Document的程序,在主程序按如下进行调用:
void CMainFrame::OnProjNew() 
{
// TODO: Add your command handler code here

char* s="/connect=\"Provider=SQLOLEDB; Server=WinXP; Database=mydb; uid=sa; pwd=sa;\";
CDoWizard dlg((LPCSTR)s,this);
dlg.DoModal();
/**/
}

编译没有任何警告和错误,该程序可以执行,但是不管DoModal返回是IDOK 还是 IDCANCEL
然后整个程序退出!
设置断点进行调试,在执行完dlg.DoModal();之后,会弹出一个“Unhandled exception in MyExe.exe: 0xC0000005: Access Violation.”的对话框。

如何解决这个问题,帮忙!
谢谢!

-------------------------------------------------------------------------------------------------------
我的DLL中的定义:
class AFX_EXT_CLASS CDoWizard : public CPropertySheetEx
{
DECLARE_DYNAMIC(CDoWizard)

// Construction
public:
CDoWizard(LPCTSTR pszCommandLine, CWnd* pParentWnd = NULL);

// Attributes
public:
CPageAdd1* m_pAdd1;
CPageAdd2* m_pAdd2;
CPageAdd3* m_pAdd3;

// Operations
public:

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDoWizard)
public:
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CDoWizard();

// Generated message map functions
protected:
//{{AFX_MSG(CDoWizard)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
BOOL ParseCmdParams(LPCTSTR pszCommandLine);
};

在Exe文件中的定义:
class AFX_EXT_CLASS CDoWizard : public CPropertySheetEx
{
public:
CDoWizard(LPCTSTR pszCommandLine, CWnd* pParentWnd = NULL);
virtual ~CDoWizard();
int ShowWizard();
};
...全文
499 点赞 收藏 30
写回复
30 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
步履人生 2008-11-30
:(
回复
步履人生 2008-11-30
:(
回复
keyayi 2008-11-27
nice
回复
步履人生 2008-11-27
询问的“jiangsheng”老大一直未出现,郁闷啊
回复
jeff_nie 2008-11-26
up
回复
derelictangel 2008-11-25
我好笨啊,都看不懂,慢慢学习

PS:
我的目标是 ---->

^_^
回复
步履人生 2008-11-24
因为是向导,3个Page的向导中要对数据库进行操作,比如增加记录,修改记录,所以我想声明一个全局变量pConn,它是用来连接数据库的,CADORecordset 的变量在过程中使用的时候声明,如果pConn也在每个页面也重新声明的话这个参数比较多了,就是基于这个考虑的。
回复
ilovedrv 2008-11-24
哦,这是个向导页啊,那还应该是窗口初始化的时候的问题,你看下每个Page页面的实现吧
回复
步履人生 2008-11-24
CDoWizard中也是没有OnInitDialog的,只是在构造函数中进行了命令行的解释等,如下:
CDoWizard::CDoWizard(LPCTSTR pszCommandLine, CWnd* pParentWnd)
:CPropertySheetEx(_T("DoWizard"), pParentWnd, 0)
{

m_pAdd1 =NULL;
m_pAdd2 =NULL;
m_pAdd3 =NULL;

if(ParseCmdParams(pszCommandLine))
{
if(g_CmdParam.sOpType.CompareNoCase("add")==0)
{ // 添加向导;
m_pAdd1=new CPageAdd1;
m_pAdd2=new CPageAdd2;
m_pAdd3=new CPageAdd3;

AddPage(m_pAdd1);
AddPage(m_pAdd2);
AddPage(m_pAdd3);
}
}

// 连接数据库
if(pConn.Open((LPCTSTR)g_CmdParam.sConnect)) // 连接数据库;
{
m_pRst=CADORecordset(&pConn);
}
else
{
CString str;
str.LoadString(IDS_DBMSG_CONN_FAILED);
AfxMessageBox(str,MB_OK);
}

m_psh.dwFlags |= PSH_WIZARD97;
}
回复
beck_zhou 2008-11-24
ding
回复
robertcarlos 2008-11-24
[Quote=引用 15 楼 liuxingvcvc 的回复:]
回帖是一种美德!传说每天回帖即可获得 10 分可用分
[/Quote]

这个比较强悍
回复
ringphone 2008-11-24
你试试看只用一个PAGE是不是还有错误,如果没有就说明几个PAGE共用一个CADODatabase,可能是其中一个释放了但其他的还要用或是退出时多次释放的问题。
回复
ilovedrv 2008-11-24
为什么要定义在全局,你放到文档类里面不可以吗,把数据库当成文档操作不就可以了
回复
步履人生 2008-11-24
检查了,好像是我定义的全局变量CADODatabase pConn;引起的。
只要把这个全局变量注释掉就不会有这样的问题出现了。
但是在我的这个向导中还必须定义这么一个全局变量。
除了在stdafx.h 中定义 extern CADODatabase pConn;
和 stdafx.cpp 中定义CADODatabase pConn;
这种方式来定义全局变量之外,还能有什么方法定义全局变量呢?

CADODatabase 是 Carlos Antollini 的那个ado操作类。

如何解决由于全局变量引起的错误对话框?
回复
ilovedrv 2008-11-23
哦,那就是CDoWizard,这是个对话框吧 ,看他的

OnInitDialog做什么了,把里面的代码屏蔽掉,如果没有问题,在逐条打开,测试到底是什么语句引起的

"记住,不要操作界面的控件"

就是说不要操作对话框界面上的控件,避免引入其它错误
回复
哈了 2008-11-23
回帖是一种美德!传说每天回帖即可获得 10 分可用分
回复
步履人生 2008-11-23
不要操作界面的控件是什么意思?
还有,刚才我试了一下Release版本也存在退出主程序的时候弹出错误对话框,但是我用upx把dll和exe都压缩了一下就没有了。
回复
步履人生 2008-11-23
我在新创建的CXDoWizard中没有OnInitDialog这个过程,关于CXDoWizard就只有下面的代码:
/////////////Head file:

#define DLLEXPORT __declspec(dllexport)

class DLLEXPORT CXDoWizard
{
public:
CXDoWizard();
virtual ~CXDoWizard();
int ShowWizard(LPCTSTR pszCmdLine);

};

////////////////cpp file
CXDoWizard::CXDoWizard()
{

}

CXDoWizard::~CXDoWizard()
{

}

int CXDoWizard::ShowWizard(LPCTSTR pszCmdLine)
{
CDoWizard dlg(pszCmdLine);
return dlg.DoModal();
}

在主程序中执行如下:
void CMainFrame::OnProjNew()
{
// TODO: Add your command handler code here

char* s="/connect=\"Provider=SQLOLEDB; Server=WinXP; Database=mydb; uid=sa; pwd=sa;\";
CDoWizard dlg((LPCSTR)s);
dlg.DoModal();
/**/
}
回复
ilovedrv 2008-11-23
记住,不要操作界面的控件
回复
ilovedrv 2008-11-23
那你看看CXDoWizard的OnInitDialog做什么了,把里面的代码屏蔽掉,如果没有问题,在逐条打开,测试到底是什么语句引起的
回复
加载更多回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-11-23 04:23
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……