我再把问题分解一下吧:
1、如何启动一个DLL
2、DLL被启动后最先执行的函数是什么
3、DLL定义好的菜单如何加载
4、DLL如何终止自己,卸载菜单

解决方案 »

  1.   

    1.两种方式:显式调用用LoadLibrary(),隐式调用在程序链接时给出DLL对应的Lib文件;
    2.DLL入口函数中的DLL_ATTACH分支;
    3.需要知道你是某个菜单项还是整个完整的菜单;
    4.显式的调用需要在调用LoadLibrary的主程序中调用FreeLibrary,隐式的不需要处理;
    如果是整个菜单,通常不需处理,如果是几个菜单项,需要自己删除,总之根据具体情况;
      

  2.   

    1、如何启动一个DLL
    HINSTANCE hInstance=LoadLibrary( "????.dll" );
    if(!hInstance)
       return;
    2、DLL被启动后最先执行的函数是什么
    //   函数当然由你在dll中定义,比如 MyFunc(...)
    typedef 返回类型 (*MYFUNC)( 参数表....);
    MYFUNC MyFunc = GetProcAddress( hInstance, "函数名MyFunc" );
    if(!MyFunc)
       return;
    MyFunc(....);
    3、DLL定义好的菜单如何加载
    HMENU hMenu = LoadMenu( hInstance, 菜单资源ID );
    SetMenu( hWnd, hMenu );
    4、DLL如何终止自己,卸载菜单
    SetMenu( hWnd, NULL );
    FreeLibrary( hInstance );
      

  3.   

    启动一个Dll文件有两种方式:
       一是应用程序自动启动,这种方法是当你的程序使用到某个DLL文件里的函数功能时window自动加载DLL文件到内存中  二是在程序源代码中明确启动,使用LoadLibrary()API函数直接启动Dll文件.
    Dll文件被启动后最先执行的函数是int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)(在C++ 里)
    如果你的Dll文件是有菜单资源,则你可以通过Api函数LoadMenu()来加载资源中的菜单
    对于Dll文件的终止,如果你是应用程序自动启动的话,它是windows自动终止的,即当没有程序再使用Dll文件里的功能函数等时(这时Dll文件的引用计数值为0),你不用自己终止;如果你是通过api函数LoadLibrary()来启动的话则要自己终止,使用api函数FreeLibrary()就行了。而对于Dll文件里的菜单资源释放则使用api函数DestroyMenu()来释放菜单资源
      

  4.   

    如果是在DLL链接库中载入DLL中定义的资源,必须完成资源句柄的切换,因为MFC中默认的资源句柄是主程序的句柄。
    1.在DLL中调用 AfxGetStaticModuleState( )取得自身的资源句柄
    2.利用AfxGetResourceHandle取得主程序的句柄
    3.利用AfxSetResourceHandle切换主程序的句柄
    4.使用DLL中的资源
    5.切换主程序的资源句柄为原来的句柄
      

  5.   

    有启发!刚才问漏了一个了问题:MFC的APPWIZARD可以产生3中DLL,就我这种情况,应该用那一种呢?OK就给分。
      

  6.   

     
    you can use every one, but perhaps first one is simpler.
    and you can insert menu staticly to your dll,so menu will auto loaded in.
    Note:
    dll also can include resource(menu, window,dialog,bitmap....).