如题

解决方案 »

  1.   

    如何从DLL中提取菜单
    ==你要如何提取???你所说的提取是什么概念?
      

  2.   

    大致步骤:
    1、加载DLL,得到句柄
    2、根据得到的句柄,查找相应的资源
    3、若找到,则产生一个CMenu对象,用其LoadMenu加载相应的菜单项(第一个参数是所打开的DLL的句柄)
    4、设法得到目标菜单的HMENU或CMenu指针
    5、用相应的API或类成员的方法将新菜单加入目标菜单匆忙之中书写,可能有疏漏,请见谅。
      

  3.   

    我按如下的方法做,菜单能显示出来,但是不能调用菜单项对应的函数1. 通过VC生成动态库,然后添加下面这个输出函数,
     
    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
     
    }
      

  4.   

    DLL和EXE中Resource.h中的定义不一样
      

  5.   

    to  goodboyws(深夜不眠者) 
       DLL和EXE中Resource.h中的定义不一样   dll为什么要和exe定义一样,我在exe中根本就没有定义这些菜单   我的本意是做一个插件,主程序加载插件后,会在视图上显示一个图标,当用户鼠标右键点击图标时,调用动态库的showmenu显示出菜单,然后选择菜单项,来调用插件提供的功能。
      

  6.   

    DLL集成的菜单?像添加普通程序一样添加好之后在外边调用DLL里边IDC就行的吧?.....见过这样的文章, 在vcbase找找?
    呵呵, 谢谢
      

  7.   

    至于你想从DLL中LOAD出图标资源的问题我不想说,只是想说说我对于你想实现通过在主程序框架上调用DLL内的函数的想法,我觉得你如果要在主程序中调用DLL内的函数,你必须明确知道此DLL暴露出来的一些接口函数,你的主程序在响应消息时调用DLL的接口函数即可,至于该调哪个接口函数以及此函数在DLL内部做些什么事情,都是你应该知道的,或者主程序的设计者与DLL的设计者必须相互沟通后知道。
      

  8.   

    唉,还是再稍微介绍一个我曾经实现的方式吧,我没有使用图标,直接在DLL内定义了几个String,当然它们的ID值我都知道,而这些ID值也就是菜单的值。我的DLL有个接口函数,负责向外界透露此DLL内共有多少个菜单,每个菜单的ID值是多少,每个菜单的名称是什么。当我的主程序LOAD此DLL时,主程序首先调用接口函数以获取此DLL能够提供哪些菜单以及菜单的值,然后主程序根据这些信息建立菜单列表。当然,这些菜单列表的菜单值都是以DLL内定义的值建立的。我的DLL还提供一个接口函数,即操作函数,此函数接受一个整型的参数,此参数意即菜单的ID值,当主程序中要响应某个菜单的点击消息时,主程序调用此DLL的操作函数,并把菜单的值传进去,DLL内部则根据此菜单值进行相应的操作。
      

  9.   

    hfeiyang(飞熊) 提供的方法妙极,
    请hfeiyang(飞熊) 到http://community.csdn.net/Expert/topic/4374/4374306.xml?temp=.44862 随便up一下,晚上一并给分