用过bcgcontrolbar的请进

langtaosha1238 2014-03-04 03:20:52
最近用BCG16.1做界面,程序由一个exe程序和一个dll程序,exe程序显示主界面,在主界面上有一个按钮,单击它调用dll界面,问题来了,单击按钮时出现debug assertion failed如图:

点重试后,进入wincore.cpp断点情况如下:
CObject* p=NULL;
if(pMap)
{
ASSERT( (p = pMap->LookupPermanent(m_hWnd)) != NULL ||
(p = pMap->LookupTemporary(m_hWnd)) != NULL);
}
ASSERT((CWnd*)p == this); // must be us

// Note: if either of the above asserts fire and you are
// writing a multithreaded application, it is likely that
// you have passed a C++ object from one thread to another
// and have used that object in a way that was not intended.
// (only simple inline wrapper functions should be used)
//
// In general, CWnd objects should be passed by HWND from
// one thread to another. The receiving thread can wrap
// the HWND with a CWnd object by using CWnd::FromHandle.
//
// It is dangerous to pass C++ objects from one thread to
// another, unless the objects are designed to be used in
// such a manner.
}

函数实现如下:在主界面中
ON_BN_CLICKED(IDC_BTN_OPENCFG, OnBtnOpenCFG)

然后通过OnBtnOpenCFG调用dll的导出函数
void CGOTODlg::OnBtnOpenCFG() 
{
HT_OpenCtrlPane();
TClose();
}

在DLL中显示界面:
	CParamSheet paramSheet;
paramSheet.DoModal();

CParamSheet类继承BCG库中的CBCGPPropertySheet类如下:

CParamSheet::CParamSheet(CWnd* pParentWnd)
:CBCGPPropertySheet (IDS_CAPTION, pParentWnd)
{
BOOL b32BitIcons = globalData.bIsOSAlphaBlendingSupport;

if (globalData.m_nBitsPerPixel == 16)
{
// 32-bit icons in 16 bpp display mode
// are correctly displayed in WinXP only

OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
::GetVersionEx (&osvi);

b32BitIcons = (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT &&
(osvi.dwMajorVersion > 5 ||
(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion >= 1)));
}

SetLook (CBCGPPropertySheet::PropSheetLook_OutlookBar);//PropSheetLook_OutlookBar);
SetIconsList (b32BitIcons ? IDB_SHEETICON32 : IDB_SHEETICON, 64);




AddPage(&m_nModePage);
AddPage(&m_nConfigPage);
AddPage(&m_nAlignPage);
// AddPage(&m_Page1);
m_pPrtParam = CPrinterParam::Create();
ASSERT(m_pPrtParam);


if(PRO_SEGMENT == m_pPrtParam->GetProPrinterMode())
{
m_pTemplatePage = NULL;

if(NULL != g_pTempLibInst)
{
TEMPPROC_MODELPAGE ProcAdd = NULL;

ProcAdd = (TEMPPROC_MODELPAGE)GetProcAddress(g_pTempLibInst, TEMPFUNC[TEMP_MODELPAGE]);

// If the function address is valid, call the function.
if(NULL != ProcAdd)
{
m_pTemplatePage = (ProcAdd)(m_pPrtParam->GetSystemOfUnit());

if(NULL == m_pTemplatePage)
AfxMessageBox("Temp_CreateModelPageDlg Failed");
}
else
{
AfxMessageBox("Get Temp_CreateModelPageDlg Address Failed");
}
}

AddPage(m_pTemplatePage);

}

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

CParamSheet::~CParamSheet()
{

if(PRO_SEGMENT == m_pPrtParam->GetProPrinterMode())
{

if(NULL != g_pTempLibInst)
{
TEMPPROC_DELMODELPAGE ProcAdd = NULL;

ProcAdd = (TEMPPROC_DELMODELPAGE)GetProcAddress(g_pTempLibInst, TEMPFUNC[TEMP_DELMODELPAGE]);

// If the function address is valid, call the function.
if(NULL != ProcAdd)
{
BOOL bRet = (ProcAdd)();

if(FALSE == bRet)
AfxMessageBox("Temp_DeleteModelPageDlg Failed");
}
else
{
AfxMessageBox("Get Temp_DeleteModelPageDlg Address Failed");
}
}

}

if(m_pPrtParam)
m_pPrtParam->Release();


}


BEGIN_MESSAGE_MAP(CParamSheet, CBCGPPropertySheet)
//{{AFX_MSG_MAP(CParamSheet)
ON_WM_QUERYDRAGICON()
ON_WM_SYSCOMMAND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPrinterParamSheet message handlers



HCURSOR CParamSheet::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;

}

void CParamSheet::OnSysCommand(UINT nID, LPARAM lParam)
{
// TODO: Add your message handler code here and/or call default

CBCGPPropertySheet::OnSysCommand(nID, lParam);
}

BOOL CParamSheet::OnInitDialog()
{
BOOL bResult = CBCGPPropertySheet::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

this->CenterWindow();

return bResult;
}

而我换成BCG15后,本来好了一段时间,现在又不行了,一样的错误,现在如果.exe程序用BCG16,dll程序用BCG15就没有那个debug assertion failed,百思不得其解,求指点迷津。
...全文
205 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤客天涯 2014-03-05
  • 打赏
  • 举报
回复
引用 7 楼 langtaosha1238 的回复:
有源码,现在是CParamSheet.DoModal时,进入CBCGPPropertySheet::OnInitDialog()函数,然后就直接出现DEBUG assertion failde了,没有进入BCG源码
把BCG代码设置依赖关联起来一起调试
langtaosha1238 2014-03-04
  • 打赏
  • 举报
回复
有源码,现在是CParamSheet.DoModal时,进入CBCGPPropertySheet::OnInitDialog()函数,然后就直接出现DEBUG assertion failde了,没有进入BCG源码
孤客天涯 2014-03-04
  • 打赏
  • 举报
回复
只要有BCG的源码就能跟进去呀
langtaosha1238 2014-03-04
  • 打赏
  • 举报
回复
BOOL bResult = CBCGPPropertySheet::OnInitDialog();
就是这里出错了,CBCGPPropertySheet::OnInitDialog()是个虚函数,CBCGPPropertySheet继承CPropertySheet类,CPropertySheet继承CWnd类;也许是我跟得不对,能告诉我这么跟踪吗
孤客天涯 2014-03-04
  • 打赏
  • 举报
回复
那你跟踪一下是哪里出错, BCG 16.1是有源代码的
langtaosha1238 2014-03-04
  • 打赏
  • 举报
回复
引用 1 楼 jason_wentzel 的回复:
跟踪一下,看是哪里断言出错,我记得 CBCGPPropertySheet类 SetIconsList (b32BitIcons ? IDB_SHEETICON32 : IDB_SHEETICON, 64);的时候,如果图标个数与页数不一致会报一个断言错误
我试了下,图标个数和页面搞成一样的也有这个错误
langtaosha1238 2014-03-04
  • 打赏
  • 举报
回复
引用 1 楼 jason_wentzel 的回复:
跟踪一下,看是哪里断言出错,我记得
CBCGPPropertySheet类
SetIconsList (b32BitIcons ? IDB_SHEETICON32 : IDB_SHEETICON, 64);的时候,如果图标个数与页数不一致会报一个断言错误

断言在这个函数的第一行出错,多谢你的指导,我去试下
BOOL CParamSheet::OnInitDialog() 
{
BOOL bResult = CBCGPPropertySheet::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

this->CenterWindow();

return bResult;
}
孤客天涯 2014-03-04
  • 打赏
  • 举报
回复
跟踪一下,看是哪里断言出错,我记得 CBCGPPropertySheet类 SetIconsList (b32BitIcons ? IDB_SHEETICON32 : IDB_SHEETICON, 64);的时候,如果图标个数与页数不一致会报一个断言错误

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧