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方式的进程间通信。