不使用ATL,手工实现一个COM时,你需要做哪些工作?请给出类定义与至少AddRef, Relesae, QueryInterface的实现代码。
需要:接口的定义和实现,DLL暴露给COM库的几个重要函数:DllGetClassObject,CoGetClassObject,DllCanUnloadNow,DllRegisterServer,DllUnregisterServer,def文件
int g_uDllRefCount = 0;
class CUnknownImpl : public IUnknown
{
public:
// 构造函数和析构器
CUnknownImpl();
virtual ~CUnknownImpl();
// IUnknown 方法
ULONG AddRef();
ULONG Release();
HRESULT QueryInterface( REFIID riid, void** ppv );
protected:
UINT m_uRefCount; // 对象的引用计数
};
//构造器和析构器
//构造器和析构器管理服务器的引用计数:
CUnknownImpl::CUnknownImpl()
{
m_uRefCount = 0;
g_uDllRefCount++;
}
CUnknownImpl::~CUnknownImpl()
{
g_uDllRefCount--;
}
//当创建新的COM对象时,构造器被调用,它增加服务器的引用计数以保持这个服务器驻留内存。
//同时它还将对象的引用计数初始化为零。当这个COM对象被摧毁时,它减少服务器的引用计数。
ULONG CUnknownImpl::AddRef()
{
return ++m_uRefCount;
}
ULONG CUnknownImpl::