小弟初学COM,向高手请教!自动化的COM组件为什么没有实现类工厂,AddRef,QueryInterface,Release
描述:
小弟初学COM,向高手请教! 自动化的COM组件为什么没有实现类工厂,AddRef(),QueryInterface(),Release()
能给我详细讲讲自动化的COM组件中上面这几个东东是怎么调用的吗?
我用ATL写了个COM组件,可以用ASP调用,但是由于在ASP中不能调用Release()函数,不能释放COM对象.
所以我每次执行ASP脚本后都要手动Kill掉dllhost.exe.有什么办法能在ASP脚本中调用完COM对象后释放该对象.
谢谢.
解决方案1:
在dll的cpp文件中wizard自动生成了一个注册宏,里面就是类工厂和注册代码
BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_CalcPi, CCalcPi)
END_OBJECT_MAP()
wizard中产生的封装类是基于模板的多重继承,其中一个基类CComObjectRootEx他实现了线程模型和AddRef,Release
template <>
class CComObjectRootEx<CComSingleThreadModel> : public CComObjectRootBase
{
public:
typedef CComSingleThreadModel _ThreadModel;
typedef _ThreadModel::AutoCriticalSection _CritSec;
typedef CComObjectLockT<_ThreadModel> ObjectLock;
ULONG InternalAddRef()
{
ATLASSERT(m_dwRef != -1L);
return _ThreadModel::Increment(&m_dwRef);
}
ULONG InternalRelease()
{
return _ThreadModel::Decrement(&m_dwRef);
}
CComObject实现了QueryInterface
<<深入解析ATL>>三.四.五章很详细
解决方案3: 再次借花献佛
http://dev.csdn.net/develop/article/13/13924.shtm