我想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.   

    个人理解:它们分属不同的module. Window Handle Map 是module相关的.你可以试试:
       (*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); //到此句出错
      

  2.   

      mfc90d.dll!CWnd::XAccessibleServer::`RTTI Complete Object Locator'()  C++
    > 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界面库
      

  3.   

    没贴全:  mfc90d.dll!CWnd::XAccessibleServer::`RTTI Complete Object Locator'()  C++
    > 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;
    这样可以吗?   
      

  4.   

    AfxSetResourceHandle,把你的handle设置为dll的,工具条处理后再设置成应用程序的
      

  5.   

    你先试一下非BCG的加载成不成
    BCG很多东西加不进去
      

  6.   

    1.应是扩展MFC DLL吧,你如何创建的? DLLMain()中是如何写的?
    2.对于模块,线程等state可参考李进久<MFC深入浅出> (注:非侯老师<深入浅出MFC>)
      

  7.   

    你可以参考一下BCG的多语言切换的DLL