佚名通过本文主要向大家介绍了atl聚合物电芯,atl锂聚合物电芯,atl聚合物电池,atl锂离子聚合物电芯,atl聚合物等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于ATL聚合的问题
描述:
一进程外单实例组件CA(EXE)实现了IA接口
一进程内组件CB(DLL)实现了IB接口
CA通过聚合CB对外提供IB接口(在FinalConstruct中已成功创建了CB组件,并在BEGIN_COM_MAP内添加了COM_INTERFACE_ENTRY_AGGREGATE以对外提供IB接口),创建CB的代码如下:
IB *b;
HRESULT hr = CoCreateInstance(__uuidof(CB),GetControllingUnknown(),CLSCTX_ALL,IID_IUnknown,(LPVOID*)&pUnknown);
if(SUCCEEDED(hr))
{
pUnknown->QueryInterface(IID_IB,(VOID**)&b);//成功
}
编写了如下测试程序(简化):
#import "CA.exe" no_namespace named_guids
#import "CB.dll" no_namespace named_guids
IAPtr a;
a.CreateInstance(__uuidof(CA));//这里可以看到加载了CA.exe,CA.exe也加载了CB.dll
a.CallMethodOfIA();//成功
IB *b;
HRESULT hr = a->QueryInterface(IID_IB,(VOID**)&b);//失败
//第一次调用a->QueryInterface(IID_IB,(VOID**)&b);时返回0x80010105
//第二次调用a->QueryInterface(IID_IB,(VOID**)&b);时返回0x800706BE,CA.exe自动退出了
这是为何?
外部组件完整代码:
内部组件部分代码:
描述:
本帖最后由 hailongxl 于 2013-07-08 17:29:29 编辑
问题如下:一进程外单实例组件CA(EXE)实现了IA接口
一进程内组件CB(DLL)实现了IB接口
CA通过聚合CB对外提供IB接口(在FinalConstruct中已成功创建了CB组件,并在BEGIN_COM_MAP内添加了COM_INTERFACE_ENTRY_AGGREGATE以对外提供IB接口),创建CB的代码如下:
IB *b;
HRESULT hr = CoCreateInstance(__uuidof(CB),GetControllingUnknown(),CLSCTX_ALL,IID_IUnknown,(LPVOID*)&pUnknown);
if(SUCCEEDED(hr))
{
pUnknown->QueryInterface(IID_IB,(VOID**)&b);//成功
}
编写了如下测试程序(简化):
#import "CA.exe" no_namespace named_guids
#import "CB.dll" no_namespace named_guids
IAPtr a;
a.CreateInstance(__uuidof(CA));//这里可以看到加载了CA.exe,CA.exe也加载了CB.dll
a.CallMethodOfIA();//成功
IB *b;
HRESULT hr = a->QueryInterface(IID_IB,(VOID**)&b);//失败
//第一次调用a->QueryInterface(IID_IB,(VOID**)&b);时返回0x80010105
//第二次调用a->QueryInterface(IID_IB,(VOID**)&b);时返回0x800706BE,CA.exe自动退出了
这是为何?
外部组件完整代码:
/////////////////////////////////////////////////////////////////////////////
// CThermoPrinter
class ATL_NO_VTABLE CThermoPrinter :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CThermoPrinter, &CLSID_ThermoPrinter>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CThermoPrinter>,
public IDispatchImpl<IThermoPrinter, &IID_IThermoPrinter, &LIBID_XFSDRIVER4COMDEVICELib>,
public CProxy_IThermoPrinterEvents<CThermoPrinter>,
public IProvideClassInfo2Impl<&CLSID_ThermoPrinter, &DIID__IThermoPrinterEvents, &LIBID_XFSDRIVER4COMDEVICELib>
{
public:
CThermoPrinter()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_THERMOPRINTER)
DECLARE_NOT_AGGREGATABLE(CThermoPrinter)
DECLARE_CLASSFACTORY_SINGLETON(CThermoPrinter)
DECLARE_GET_CONTROLLING_UNKNOWN()
DECLARE_PROTECT_FINAL_CONSTRUCT()
//__uuidof(ILockController)替代IID_ILockController,否则会链接错误unresolved external symbol _IID_ILockController
BEGIN_COM_MAP(CThermoPrinter)
COM_INTERFACE_ENTRY(IThermoPrinter)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(ILockController),m_pLockController)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CThermoPrinter)
CONNECTION_POINT_ENTRY(DIID__IThermoPrinterEvents)
END_CONNECTION_POINT_MAP()
STDMETHOD(FinalConstruct)();
void FinalRelease();
private:
ILockController *m_pLockController;
CLockControllerEventsSink<CThermoPrinter> m_LockControllerEventsSink;
HRESULT CThermoPrinter::FinalConstruct()
{
IUnknown *pUnknown;
//__uuidof(LockController)替代CLSID_ILockControllerEvents,否则会链接错误unresolved external symbol _CLSID_LockController
HRESULT hr = CoCreateInstance(__uuidof(LockController),GetControllingUnknown(),CLSCTX_ALL,IID_IUnknown,(LPVOID*)&pUnknown);
if(SUCCEEDED(hr))
{
//__uuidof(ILockController)替代IID_ILockController,否则会链接错误unresolved external symbol _IID_ILockController
hr = pUnknown->QueryInterface(__uuidof(ILockController),(VOID**)&m_pLockController);
pUnknown->Release();
if(SUCCEEDED(hr))
{
hr = m_LockControllerEventsSink.Connect(this,m_pLockController);
if(FAILED(hr))
m_pLockController->Release();
}
}
return hr;
}
void CThermoPrinter::FinalRelease()
{
if(m_pLockController)
{
m_LockControllerEventsSink.Disconnect();
m_pLockController->Release();
}
}
内部组件部分代码:
class ATL_NO_VTABLE CLockController :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CLockController, &CLSID_LockController>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CLockController>,
public IDispatchImpl<ILockController, &IID_ILockController, &LIBID_XFSLOCKCONTROLLERLib>,
public CProxy_ILockControllerEvents<CLockController>,
public IProvideClassInfo2Impl<&CLSID_LockController, &DIID__ILockControllerEvents, &LIBID_XFSLOCKCONTROLLERLib>
{
public:
CLockController()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_LOCKCONTROLLER)
DECLARE_ONLY_AGGREGATABLE(CLockController)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CLockController)
COM_INTERFACE_ENTRY(ILockController)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CLockController)
CONNECTION_POINT_ENTRY(DIID__ILockControllerEvents)
END_CONNECTION_POINT_MAP()