FreeLibrary(hmod); // TODO: Add your control notification handler code here
}
DLL和EXE中Resource.h中的定义不一样
to goodboyws(深夜不眠者) DLL和EXE中Resource.h中的定义不一样 dll为什么要和exe定义一样,我在exe中根本就没有定义这些菜单 我的本意是做一个插件,主程序加载插件后,会在视图上显示一个图标,当用户鼠标右键点击图标时,调用动态库的showmenu显示出菜单,然后选择菜单项,来调用插件提供的功能。
==你要如何提取???你所说的提取是什么概念?
1、加载DLL,得到句柄
2、根据得到的句柄,查找相应的资源
3、若找到,则产生一个CMenu对象,用其LoadMenu加载相应的菜单项(第一个参数是所打开的DLL的句柄)
4、设法得到目标菜单的HMENU或CMenu指针
5、用相应的API或类成员的方法将新菜单加入目标菜单匆忙之中书写,可能有疏漏,请见谅。
extern "C" __declspec(dllexport) void ShowMenu(CWnd* pWnd)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CMenu menu;
menu.LoadMenu(IDR_MENU1); //IDR_MENU1是在动态库里定义,有Hello和Hi两个ITEM
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = pWnd;
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, lpoint->x, lpoint->y,
pWndPopupOwner);
}
2. 然后给Hello和Hi两个ITEMD定义两个消息响应函数
void CMFCDLLApp::OnMenuItemHello()
{
AfxMessageBox("Hello");
}
void CMFCDLLApp::OnMenuItemHi()
{
AfxMessageBox("Hi");
}
3.在exe可执行程序中调用动态库的ShowMenu函数, 菜单能显示出来,但是点Hello或Hi的时候不会弹出AfxMessageBox("Hello")或AfxMessageBox("Hi");
请问如何才能调用动态库中OnMenuItemHello,OnMenuItemHi两个函数
void CTestDlg::OnButton1()
{
typedef void (_cdecl *TESTDLL)();
HINSTANCE hmod;
hmod = ::LoadLibrary ("mfcdll.dll");
if(hmod==NULL)
{
AfxMessageBox("Fail");
}
TESTDLL lpproc;
lpproc = (TESTDLL)GetProcAddress (hmod,"ShowMenu");
if(lpproc!=(TESTDLL)NULL)
(lpproc)(this);
FreeLibrary(hmod); // TODO: Add your control notification handler code here
}
DLL和EXE中Resource.h中的定义不一样 dll为什么要和exe定义一样,我在exe中根本就没有定义这些菜单 我的本意是做一个插件,主程序加载插件后,会在视图上显示一个图标,当用户鼠标右键点击图标时,调用动态库的showmenu显示出菜单,然后选择菜单项,来调用插件提供的功能。
呵呵, 谢谢
请hfeiyang(飞熊) 到http://community.csdn.net/Expert/topic/4374/4374306.xml?temp=.44862 随便up一下,晚上一并给分