从DLL里加载工具条的问题

woshierjian 2011-08-08 11:50:21
我想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); 就出错。
...全文
265 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjmr44 2013-07-09
  • 打赏
  • 举报
回复
引用 14 楼 dongnan12 的回复:
以前遇到过,想不起来怎么解决了
帮助想想吧,现在卡在这地方了。。。
dongnan12 2013-07-09
  • 打赏
  • 举报
回复
以前遇到过,想不起来怎么解决了
sjmr44 2013-07-09
  • 打赏
  • 举报
回复
引用 12 楼 woshierjian 的回复:
感谢楼上各位,我先查下资料,过几天给分!
楼主问题解决了吗,我也遇到这个问题 了。
woshierjian 2011-08-09
  • 打赏
  • 举报
回复
感谢楼上各位,我先查下资料,过几天给分!
  • 打赏
  • 举报
回复
你可以参考一下BCG的多语言切换的DLL
zereyyoooo 2011-08-08
  • 打赏
  • 举报
回复
帮顶~~~~~~~~!
Cline 2011-08-08
  • 打赏
  • 举报
回复
1.应是扩展MFC DLL吧,你如何创建的? DLLMain()中是如何写的?
2.对于模块,线程等state可参考李进久<MFC深入浅出> (注:非侯老师<深入浅出MFC>)
呔妖怪来嘛 2011-08-08
  • 打赏
  • 举报
回复
你先试一下非BCG的加载成不成
BCG很多东西加不进去
Cline 2011-08-08
  • 打赏
  • 举报
回复
Sorry,没用过BCG。
buyong 2011-08-08
  • 打赏
  • 举报
回复
AfxSetResourceHandle,把你的handle设置为dll的,工具条处理后再设置成应用程序的
woshierjian 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cline 的回复:]
把CallStack贴上来。
[/Quote]
没贴全:

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;
这样可以吗?
woshierjian 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cline 的回复:]
把CallStack贴上来。
[/Quote]


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界面库
Cline 2011-08-08
  • 打赏
  • 举报
回复
把CallStack贴上来。
woshierjian 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cline 的回复:]
个人理解:它们分属不同的module. Window Handle Map 是module相关的.

你可以试试:
(*pf1)(m_hWnd,&pTool,m_ToolBar1);
CString strMDIToolbarTitle;
strMDIToolbarTitle.LoadString(IDW_DIALOGBAR1);
m_ToolBar1->Set……
[/Quote]

还是不行
Cline 2011-08-08
  • 打赏
  • 举报
回复
个人理解:它们分属不同的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); //到此句出错

15,472

社区成员

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

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