我想MDI从DLL里加载工具条。
计划如下:
1.在DLL里创建工具条extern "C" _declspec(dllexport) BOOL FristToolBarAPI (HWND HParentWnd,HWND* pHFunctionWnd,CBCGPToolBar*& pTool)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CWnd* m_parentwnd=CWnd::FromHandle(HParentWnd); m_wndToolBar = new CBCGPToolBar;
if (m_wndToolBar != NULL)
{
//m_wndDialogBar->Create(IDD_ADD1DLG,m_parentwnd);
if (!m_wndToolBar->Create (m_parentwnd,
WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|
CBRS_HIDE_INPLACE|CBRS_SIZE_DYNAMIC|
CBRS_GRIPPER | CBRS_BORDER_3D, IDW_BAR1) ||
!m_wndToolBar->LoadToolBar(IDR_TOOLBAR1, 0, 0, FALSE, 0, 0, IDB_BITMAP1))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
*pHFunctionWnd=m_wndToolBar->m_hWnd;
pTool=m_wndToolBar;
}
return TRUE;
}
2.在CChildFrame中OnCreate()调用hToolDll=LoadLibrary(_T("AddBCGDlll.dll"));
if (hToolDll==NULL)
{
AfxMessageBox("LoadDllError");
}
else
{
ShowPARChildBar * pf1;
pf1=(ShowPARChildBar *)::GetProcAddress(hToolDll,_T("FristToolBarAPI"));
if (pf1==NULL)
{
AfxMessageBox("LoadProcError");
FreeLibrary(hToolDll);
hToolDll=NULL;
}
else
{
(*pf1)(m_hWnd,&pTool,m_ToolBar1);
CString strMDIToolbarTitle;
strMDIToolbarTitle.LoadString(IDW_DIALOGBAR1);
m_ToolBar1->SetWindowText(strMDIToolbarTitle);
m_ToolBar1->EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY); DockControlBar (m_ToolBar1, AFX_IDW_DOCKBAR_BOTTOM); //到此句出错 }
}
DockControlBar (m_ToolBar1, AFX_IDW_DOCKBAR_BOTTOM); //到此句出错
出错,注释掉此句,工具条不显示,为什么呢?大牛帮帮忙啊?我把工具条创建放在CChildFrame的OnCreate()正常。放在DLL里调用,到DockControlBar(m_ToolBar1, AFX_IDW_DOCKBAR_BOTTOM); 就出错。
计划如下:
1.在DLL里创建工具条extern "C" _declspec(dllexport) BOOL FristToolBarAPI (HWND HParentWnd,HWND* pHFunctionWnd,CBCGPToolBar*& pTool)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CWnd* m_parentwnd=CWnd::FromHandle(HParentWnd); m_wndToolBar = new CBCGPToolBar;
if (m_wndToolBar != NULL)
{
//m_wndDialogBar->Create(IDD_ADD1DLG,m_parentwnd);
if (!m_wndToolBar->Create (m_parentwnd,
WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|
CBRS_HIDE_INPLACE|CBRS_SIZE_DYNAMIC|
CBRS_GRIPPER | CBRS_BORDER_3D, IDW_BAR1) ||
!m_wndToolBar->LoadToolBar(IDR_TOOLBAR1, 0, 0, FALSE, 0, 0, IDB_BITMAP1))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
*pHFunctionWnd=m_wndToolBar->m_hWnd;
pTool=m_wndToolBar;
}
return TRUE;
}
2.在CChildFrame中OnCreate()调用hToolDll=LoadLibrary(_T("AddBCGDlll.dll"));
if (hToolDll==NULL)
{
AfxMessageBox("LoadDllError");
}
else
{
ShowPARChildBar * pf1;
pf1=(ShowPARChildBar *)::GetProcAddress(hToolDll,_T("FristToolBarAPI"));
if (pf1==NULL)
{
AfxMessageBox("LoadProcError");
FreeLibrary(hToolDll);
hToolDll=NULL;
}
else
{
(*pf1)(m_hWnd,&pTool,m_ToolBar1);
CString strMDIToolbarTitle;
strMDIToolbarTitle.LoadString(IDW_DIALOGBAR1);
m_ToolBar1->SetWindowText(strMDIToolbarTitle);
m_ToolBar1->EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY); DockControlBar (m_ToolBar1, AFX_IDW_DOCKBAR_BOTTOM); //到此句出错 }
}
DockControlBar (m_ToolBar1, AFX_IDW_DOCKBAR_BOTTOM); //到此句出错
出错,注释掉此句,工具条不显示,为什么呢?大牛帮帮忙啊?我把工具条创建放在CChildFrame的OnCreate()正常。放在DLL里调用,到DockControlBar(m_ToolBar1, AFX_IDW_DOCKBAR_BOTTOM); 就出错。
(*pf1)(m_hWnd,&pTool,m_ToolBar1);
CString strMDIToolbarTitle;
strMDIToolbarTitle.LoadString(IDW_DIALOGBAR1);
m_ToolBar1->SetWindowText(strMDIToolbarTitle);
m_ToolBar1->EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY); CToolBar& toolBar = (*(CToolBar*)CWnd::FromHandle ( m_ToolBar1.GetSafeHandle())); DockControlBar (toolBar , AFX_IDW_DOCKBAR_BOTTOM); //到此句出错
> BCGCBPRO1200d90.dll!CBCGPMDIChildWnd::DockControlBar(CBCGPBaseControlBar * pBar=0x01e1278c, unsigned int nDockBarID=59422, const tagRECT * __formal=0x00000000) Line 646 + 0x12 bytes C++
BCGToolBarDel.exe!CChildFrame::OnCreate(tagCREATESTRUCTA * lpCreateStruct=0x0012ec04) Line 191 + 0x19 bytes C++
mfc90d.dll!CWnd::OnWndMsg(unsigned int message=1, unsigned int wParam=0, long lParam=1240068, long * pResult=0x0012e9d8) Line 2014 + 0xd bytes C++
mfc90d.dll!CWnd::WindowProc(unsigned int message=1, unsigned int wParam=0, long lParam=1240068) Line 1755 + 0x20 bytes C++
mfc90d.dll!AfxCallWndProc(CWnd * pWnd=0x01e1cc28, HWND__ * hWnd=0x0012198a, unsigned int nMsg=1, unsigned int wParam=0, long lParam=1240068) Line 240 + 0x1c bytes C++
mfc90d.dll!AfxWndProc(HWND__ * hWnd=0x0012198a, unsigned int nMsg=1, unsigned int wParam=0, long lParam=1240068) Line 403 C++
mfc90d.dll!AfxWndProcBase(HWND__ * hWnd=0x0012198a, unsigned int nMsg=1, unsigned int wParam=0, long lParam=1240068) Line 441 + 0x15 bytes C++
user32.dll!77d18734()
[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]
user32.dll!77d2bdf1() 忘了说了,我用的BCG界面库
> BCGCBPRO1200d90.dll!CBCGPMDIChildWnd::DockControlBar(CBCGPBaseControlBar * pBar=0x01e1278c, unsigned int nDockBarID=59422, const tagRECT * __formal=0x00000000) Line 646 + 0x12 bytes C++
BCGToolBarDel.exe!CChildFrame::OnCreate(tagCREATESTRUCTA * lpCreateStruct=0x0012ec04) Line 191 + 0x19 bytes C++
mfc90d.dll!CWnd::OnWndMsg(unsigned int message=1, unsigned int wParam=0, long lParam=1240068, long * pResult=0x0012e9d8) Line 2014 + 0xd bytes C++
mfc90d.dll!CWnd::WindowProc(unsigned int message=1, unsigned int wParam=0, long lParam=1240068) Line 1755 + 0x20 bytes C++
mfc90d.dll!AfxCallWndProc(CWnd * pWnd=0x01e1cc28, HWND__ * hWnd=0x0012198a, unsigned int nMsg=1, unsigned int wParam=0, long lParam=1240068) Line 240 + 0x1c bytes C++
mfc90d.dll!AfxWndProc(HWND__ * hWnd=0x0012198a, unsigned int nMsg=1, unsigned int wParam=0, long lParam=1240068) Line 403 C++
mfc90d.dll!AfxWndProcBase(HWND__ * hWnd=0x0012198a, unsigned int nMsg=1, unsigned int wParam=0, long lParam=1240068) Line 441 + 0x15 bytes C++
user32.dll!77d18734()
[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]
user32.dll!77d2bdf1()
user32.dll!77d2947c()
user32.dll!77d2f40b()
mfc90d.dll!CMDIChildWnd::Create(const char * lpszClassName=0x00000000, const char * lpszWindowName=0x78a44e50, unsigned long dwStyle=1087340544, const tagRECT & rect={...}, CMDIFrameWnd * pParentWnd=0x01df0068, CCreateContext * pContext=0x0012f73c) Line 547 + 0x1b bytes C++
mfc90d.dll!CMDIChildWnd::LoadFrame(unsigned int nIDResource=1007, unsigned long dwDefaultStyle=1087340544, CWnd * pParentWnd=0x00000000, CCreateContext * pContext=0x0012f73c) Line 617 + 0x3b bytes C++
BCGToolBarDel.exe!CMainFrame::ShowView() Line 509 + 0x2e bytes C++
mfc90d.dll!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x01df0068, unsigned int nID=32851, int nCode=0, void (void)* pfn=0x00411442, void * pExtra=0x00000000, unsigned int nSig=57, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 82 C++
mfc90d.dll!CCmdTarget::OnCmdMsg(unsigned int nID=32851, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 381 + 0x27 bytes C++
mfc90d.dll!CFrameWnd::OnCmdMsg(unsigned int nID=32851, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 946 + 0x18 bytes C++
mfc90d.dll!CMDIFrameWnd::OnCmdMsg(unsigned int nID=32851, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 82 C++
BCGCBPRO1200d90.dll!CBCGPMDIFrameWnd::OnCmdMsg(unsigned int nID=32851, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Line 1545 + 0x18 bytes C++
mfc90d.dll!CWnd::OnCommand(unsigned int wParam=32851, long lParam=0) Line 2364 C++
mfc90d.dll!CFrameWnd::OnCommand(unsigned int wParam=32851, long lParam=0) Line 366 C++
mfc90d.dll!CMDIFrameWnd::OnCommand(unsigned int wParam=32851, long lParam=0) Line 51 + 0x10 bytes C++
BCGCBPRO1200d90.dll!CBCGPMDIFrameWnd::OnCommand(unsigned int wParam=32851, long lParam=0) Line 437 + 0x10 bytes C++
mfc90d.dll!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=32851, long lParam=0, long * pResult=0x0012fc94) Line 1769 + 0x1e bytes C++
mfc90d.dll!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=32851, long lParam=0) Line 1755 + 0x20 bytes C++
mfc90d.dll!AfxCallWndProc(CWnd * pWnd=0x01df0068, HWND__ * hWnd=0x00181a98, unsigned int nMsg=273, unsigned int wParam=32851, long lParam=0) Line 240 + 0x1c bytes C++
mfc90d.dll!AfxWndProc(HWND__ * hWnd=0x00181a98, unsigned int nMsg=273, unsigned int wParam=32851, long lParam=0) Line 403 C++
mfc90d.dll!AfxWndProcBase(HWND__ * hWnd=0x00181a98, unsigned int nMsg=273, unsigned int wParam=32851, long lParam=0) Line 441 + 0x15 bytes C++
user32.dll!77d18734()
user32.dll!77d18816()
user32.dll!77d189cd()
user32.dll!77d196c7()
mfc90d.dll!AfxInternalPumpMessage() Line 183 C++
mfc90d.dll!CWinThread::PumpMessage() Line 900 C++
mfc90d.dll!CWinThread::Run() Line 629 + 0xd bytes C++
mfc90d.dll!CWinApp::Run() Line 865 C++
mfc90d.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00151f1f, int nCmdShow=1) Line 47 + 0xd bytes C++
BCGToolBarDel.exe!WinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, char * lpCmdLine=0x00151f1f, int nCmdShow=1) Line 34 C++
BCGToolBarDel.exe!__tmainCRTStartup() Line 578 + 0x35 bytes C
BCGToolBarDel.exe!WinMainCRTStartup() Line 403 C
kernel32.dll!7c817077() m_ToolBar1.GetSafeHandle();
该ToorBar没有GetSafeHandle(),
我直接在DLL中传了一个HWND: *pHFunctionWnd=m_wndToolBar->m_hWnd;
这样可以吗?
BCG很多东西加不进去
2.对于模块,线程等state可参考李进久<MFC深入浅出> (注:非侯老师<深入浅出MFC>)