我自己做了一个MyToolBar的类,把它封装在一个DLL中,在DLL中导出一个显示函数DisplayMyToolBar(CFrameWnd *hWnd),函数定义是
BOOL DisplayMyToolBar(CFrameWnd *hWnd)
{
MyToolBar m_wndMyToolBar; //创建MyToolBar
if (!m_wndMyToolBar .Create(_T("记录列表"), hWnd, 123))
{
TRACE0("Failed to create CoolBar\n");
return -1; // fail to create
} m_wndMyToolBar .EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndMyToolBar , AFX_IDW_DOCKBAR_LEFT); return TRUE;
}其中函数参数CFrameWnd *hWnd的类型本来是想CMainFrame类的,结果发现此类在创建主程序是才会派生出来,而在DLL中根本没有,所以不能使用。然后在新建的主应用程序中的CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函数中,加入DisplayMyToolBar(this)语句(加在这里主要是因为主程序的工具栏和状态栏的加载都在这里,就照做了)。this指针的用法也和主程序的工具栏状态栏的使用是一样的。 现在问题来了,把DLL和主程序都编译通过,DLL和主程序的链接也无问题,可是在运行主程序的可执行文件时出错,让你终止、重试或忽略。 我估计就是涉及到的两个指针不一样的问题。一个是CFrameWnd,一个是CMainFrame,可是这个CMainFrame的指针到底应该如何传递,在DLL中又应该如何定义,这个我就不清楚了。所以请各位高手帮忙解答一下。谢谢!!!
BOOL DisplayMyToolBar(CFrameWnd *hWnd)
{
MyToolBar m_wndMyToolBar; //创建MyToolBar
if (!m_wndMyToolBar .Create(_T("记录列表"), hWnd, 123))
{
TRACE0("Failed to create CoolBar\n");
return -1; // fail to create
} m_wndMyToolBar .EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndMyToolBar , AFX_IDW_DOCKBAR_LEFT); return TRUE;
}其中函数参数CFrameWnd *hWnd的类型本来是想CMainFrame类的,结果发现此类在创建主程序是才会派生出来,而在DLL中根本没有,所以不能使用。然后在新建的主应用程序中的CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函数中,加入DisplayMyToolBar(this)语句(加在这里主要是因为主程序的工具栏和状态栏的加载都在这里,就照做了)。this指针的用法也和主程序的工具栏状态栏的使用是一样的。 现在问题来了,把DLL和主程序都编译通过,DLL和主程序的链接也无问题,可是在运行主程序的可执行文件时出错,让你终止、重试或忽略。 我估计就是涉及到的两个指针不一样的问题。一个是CFrameWnd,一个是CMainFrame,可是这个CMainFrame的指针到底应该如何传递,在DLL中又应该如何定义,这个我就不清楚了。所以请各位高手帮忙解答一下。谢谢!!!
应该加在CMainFrame的定义中,即做为CMainFrame的成员变量,
要不然用
static MyToolBar m_wndMyToolBar;
MyToolBar* p_wndMyToolBar = new MyToolBar; 记得要释放!
delete p_wndMyToolBar;
BOOL DisplayMyToolBar(CFrameWnd *hWnd,MyToolBar *m_wndMyToolBar)
{ //创建MyToolBar
if (!m_wndMyToolBar .Create(_T("记录列表"), hWnd, 123))
{
TRACE0("Failed to create CoolBar\n");
return -1; // fail to create
} m_wndMyToolBar .EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndMyToolBar , AFX_IDW_DOCKBAR_LEFT); return TRUE;
}本以为这样就可以了,结果刚运行程序,就弹出了程序错误,将被关闭的提示框。设了断点后,发现问题出在m_wndMyToolBar .Create(_T("记录列表"), hWnd, 123)上,到了这句就运行不下去了,提示什么访问违例之类的话。请有经验的高手帮忙看看问题出在什么地方,谢谢。
在CMainFrame中先
MyToolBar *m_wndMyToolBar;
m_wndMyToolBar = new MyToolBar;
再调用DisplayMyToolBar函数
记得最后delete m_wndMyToolBar;
CSCBButton
CSCBDockBar
CSizingControlBar
CSizingControlBarG
四个类的声明中统统加上AFX_EXT_CLASS,并在CMainFrame实现文件中加上
#pragma comment(lib,"ReportDLL.lib")还有,DisplayCoolBar函数显然是多余,你大可不必费此周章,你只需要在CMainFrame::OnCreate(...)中如下使用即可 m_wndCoolBar = new CCoolBar; //创建CoolBar
if (!m_wndCoolBar->Create(_T("记录列表"), this, 123))
{
TRACE0("Failed to create CoolBar\n");
return -1; // fail to create
}最后有一点小bug,如果你调用m_wndCoolBar->EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(m_wndCoolBar);的话会出现Debug Assertion Failure错误,因此需要将它删掉
{
delete m_wndCoolBar;
}