1 、《com原理及应用》第四章中,                                     
用midl产生的文件加上一个def文件代理存根dll。                        
我不明的是明明没有实现  DllGetClassObject                           
                        DllCanUnloadNow                       
      GetProxyDllInfo               
      DllRegisterServer             
      DllUnregisterServer              
这五个函数,但还是要用def引出?引出的究竟是什么东西?                                                                
                                                                    
2、如果做一个进程内组件,把midl产生的文件全都加到工程里,           
所生成的dll里是否也含有代理存根?

解决方案 »

  1.   

    你说的这几个函数是存在地,通常,产生的文件中有一个dlldata.cd的文件,这个里边就有。
    例如:#include <rpcproxy.h>#ifdef __cplusplus
    extern "C"   {
    #endifEXTERN_PROXY_FILE( DBFServer )
    EXTERN_PROXY_FILE( ReceItfc )
    PROXYFILE_LIST_START
    /* Start of list */
      REFERENCE_PROXY_FILE( DBFServer ),
      REFERENCE_PROXY_FILE( ReceItfc ),
    /* End of list */
    PROXYFILE_LIST_END
    DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )#ifdef __cplusplus
    }  /*extern "C" */
    #endif/* end of generated dlldata file */DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )
    展开以后是:
    // the dll entry points that must be defined
    #define DLLDATA_ROUTINES(pProxyFileList,pClsID )    \
        \
        CLSID_PSFACTORYBUFFER \
        \
        CStdPSFactoryBuffer       gPFactory = {0,0,0,0};  \
        \
        DLLDATA_GETPROXYDLLINFO(pProxyFileList,pClsID) \
        \
        DLLGETCLASSOBJECTROUTINE(pProxyFileList,pClsID,&gPFactory)    \
        \
        DLLCANUNLOADNOW(&gPFactory)   \
        \
        CSTDSTUBBUFFERRELEASE(&gPFactory)   \
        \
        CSTDSTUBBUFFER2RELEASE(&gPFactory) \
        \
        DLLDUMMYPURECALL    \
        \
        DLLREGISTRY_ROUTINES(pProxyFileList, pClsID) \
        \    // more code goes here...这些宏里就包含了上述的函数。如:
    DLLCANUNLOADNOW(&gPFactory)
    展开以后是:
    #define DLLCANUNLOADNOW(pFactory)   \
     HRESULT STDAPICALLTYPE DLLCANUNLOADNOW_ENTRY()    \
        {   \
        return NdrDllCanUnloadNow( pFactory );    \
        }这下子,你就明白了吧!进程内组件,一般是不需要代理的。至于代码里是否包含代理存根代码,是取决于你创建DLL组件时,是否允许合并代理存根代码的选项。