首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

com中CLSCTX_LOCAL_SERVER和CLSCTX_INPROC_SERVER的区别,该怎么处理

2012-03-25 
com中CLSCTX_LOCAL_SERVER和CLSCTX_INPROC_SERVER的区别//--------------------------------------------H

com中CLSCTX_LOCAL_SERVER和CLSCTX_INPROC_SERVER的区别
//--------------------------------------------
HRESULT CA::Init()
{
trace("Create Component 2, which is aggregated.") ;
HRESULT hr = CoCreateInstance(CLSID_Component2, 
GetOuterUnknown(), 
CLSCTX_INPROC_SERVER,
//CLSCTX_ALL, //@Multi
IID_IUnknown,
(void**)&m_pUnknownInner) ;
if (FAILED(hr))
{
trace("Could not create inner component.", hr) ;
return E_FAIL ;
}

trace("Get pointer to interface IZ to cache.") ;
hr = m_pUnknownInner->QueryInterface(IID_IZ, (void**)&m_pIZ) ;
if (FAILED(hr))
{
trace("Inner component does not support IZ.", hr) ;
m_pUnknownInner->Release() ;
m_pUnknownInner = NULL ;
return E_FAIL ;
}

// Decrement the reference count caused by the QI call.
trace("Got IZ interface pointer. Release reference.") ;
GetOuterUnknown()->Release() ;
return S_OK ;
}
//--------------------------------------------
BOOL CFactory::StartFactories()
{
CFactoryData* pStart = &g_FactoryDataArray[0] ;
const CFactoryData* pEnd =
&g_FactoryDataArray[g_cFactoryDataEntries - 1] ;

for(CFactoryData* pData = pStart ; pData <= pEnd ; pData++)
{
// Initialize the class factory pointer and cookie.
pData->m_pIClassFactory = NULL ;
pData->m_dwRegister = NULL ;

// Create the class factory for this component.
IClassFactory* pIFactory = new CFactory(pData) ;

// Register the class factory.
DWORD dwRegister ;
HRESULT hr = ::CoRegisterClassObject(
*pData->m_pCLSID,
static_cast<IUnknown*>(pIFactory),
CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE,
// REGCLS_MULTI_SEPARATE, //@Multi
&dwRegister) ;
if (FAILED(hr))
{
pIFactory->Release() ;
return FALSE ;
}

// Set the data.
pData->m_pIClassFactory = pIFactory ;
pData->m_dwRegister = dwRegister ;
}
return TRUE ;
}


请高手详细说一下这两个关键字的区别。

[解决办法]
这第三个参数叫做类上下文。可以控制所创建组件是在与客户相同的进程中运行,还是在不同的进程中运行,即所谓的进程内组件和进程外组件。
CLSCTX_INPROC_HANDLER,进程内组件。一般是DLL实现。
CLSCTX_LOCAL_SERVER,同一机器上的进程外组件。是EXE实现。
组件服务器与客户端之间通过代理通信,因此可以实现EXE方式的进程间通信。

热点排行