原帖:http://topic.csdn.net/u/20081212/21/d9fc11b0-3ee0-4458-bc5d-84448294a656.html?seed=1848472261MFC Extension DLL,内部有一个CDlgXXXX,封装在一个函数中:int getXXXX(char *XX, char *XXX)
{
char Reader[8]="";
GetParam("READER", Reader);if( Reader[0]=='0' )
{
CString Info;
CDlgXXXX dlg; //这是一个自定义的对话框,未导出
if( dlg.DoModal() == IDOK ) //release版本报错:Unhandle Exception in XXX.exe(MFC42.DLL) 0XC0000005 Access Violation
{
.......
//exe对这个dll的调用方式为 LoadLibrary+GetProcAddress 方式;debug版本无报错
==============================================================
同时,还有一个现象:
exe直接使用 LoadLibrary+GetProcAddress 调用dll导出函数时候,dlg.DoModal()报错;
但是,使用了一个ocx控件,在ocx控件中以LoadLibrary+GetProcAddress 调用dll导出函数,然后在exe中调用ocx的接口,发现dlg.DoModal()可以正常工作问题:
1 为何dlg.DoModal()会报错?有朋友提出是Dialog初始化失败,那为何在ocx中可以正常显示并完成函数功能?
2 断点发现 Dialog hWnd=0x00000000,即使是在Debug模式下程序已经正常运行了,DoModal后的dlg.m_hWnd依然是0x00000000,何解?如果说对话框初始化失败,那么之前显示的对话框是?
3 似乎如果在dll中是use MFC in shared DLL, 那么对话框相关操作是需要模块状态的吧?可是在我的dll中并没有这部分的代码,为何也可以工作?(虽然Release版本出错,但是它是在对话框出现后马上报错的,可以看到弹出的对话框就是在DLL中定义的对话框)求解!
{
char Reader[8]="";
GetParam("READER", Reader);if( Reader[0]=='0' )
{
CString Info;
CDlgXXXX dlg; //这是一个自定义的对话框,未导出
if( dlg.DoModal() == IDOK ) //release版本报错:Unhandle Exception in XXX.exe(MFC42.DLL) 0XC0000005 Access Violation
{
.......
//exe对这个dll的调用方式为 LoadLibrary+GetProcAddress 方式;debug版本无报错
==============================================================
同时,还有一个现象:
exe直接使用 LoadLibrary+GetProcAddress 调用dll导出函数时候,dlg.DoModal()报错;
但是,使用了一个ocx控件,在ocx控件中以LoadLibrary+GetProcAddress 调用dll导出函数,然后在exe中调用ocx的接口,发现dlg.DoModal()可以正常工作问题:
1 为何dlg.DoModal()会报错?有朋友提出是Dialog初始化失败,那为何在ocx中可以正常显示并完成函数功能?
2 断点发现 Dialog hWnd=0x00000000,即使是在Debug模式下程序已经正常运行了,DoModal后的dlg.m_hWnd依然是0x00000000,何解?如果说对话框初始化失败,那么之前显示的对话框是?
3 似乎如果在dll中是use MFC in shared DLL, 那么对话框相关操作是需要模块状态的吧?可是在我的dll中并没有这部分的代码,为何也可以工作?(虽然Release版本出错,但是它是在对话框出现后马上报错的,可以看到弹出的对话框就是在DLL中定义的对话框)求解!
没有的话在函数最前面加上
int getXXXX(char *XX, char *XXX)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
char Reader[8]="";
GetParam("READER", Reader); if( Reader[0]=='0' )
{
CString Info;
CDlgXXXX dlg; //这是一个自定义的对话框,未导出
if( dlg.DoModal() == IDOK ) //release版本报错:Unhandle Exception in XXX.exe(MFC42.DLL) 0XC0000005 Access Violation
{
.......
--- 这个多数就是对话框创建过程中失败了,返回FALSE,对话框没有创建成功,所以为NULL。
实际并不是这样,首先在debug的时候是不能跟进到DoModal函数中去的,因此,函数内发生了什么我们不知道,其次,如此跟踪看到的hWnd只能是在DoModal之前和之后,也就是得到分配前和释放后,也就是说,我们看到了hWnd=0x00000000并不意味着创建失败,实际上你在对话框的类中重载OnInitDialog再看一下hWnd就可以看到,这里重载OnInitDialog也是一个办法,楼主不妨一试
2 release版增加调试信息后,运行出错点击“调试”,报内存错,无法进入调试界面请教···
2、“报内存错”时有没有“重试”或者“中断”按钮?