描述:
自己抛开了ATL写了一个进程外的组件但是没有成功,不知道为什么?
自定义的接口:
#include <windows.h>
class IHelloInterface : public IUnknown
{
public:
IHelloInterface(){}
~IHelloInterface(){}
STDMETHOD (Hello)() PURE;
};
对象类:
CHello::CHello ()
{
m_RefCount = 1 ;
}
CHello::~CHello()
{
}
STDMETHODIMP CHello::QueryInterface(REFIID riid, LPVOID *ppv)
{
if(IID_IUnknown == riid)
{
*ppv=static_cast<IUnknown*>(this);
AddRef();
return S_OK;
}
else if(__uuidof(IHelloInterface) == riid)
{
*ppv=static_cast<IHelloInterface*>(this);
AddRef();
return S_OK;
}
else
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CHello::AddRef(void)
{
return ++m_RefCount;
}
STDMETHODIMP_(ULONG) CHello::Release(void)
{
m_RefCount -- ;
if (m_RefCount == 0)
{
delete this;
return 0 ;
}
return m_RefCount ;
}
STDMETHODIMP CHello::Hello()
{
MessageBox(NULL,"Hello","Test",MB_OK);
return NOERROR ;
}
类厂的实现:
CClassFactory::CClassFactory (void)
{
m_RefCount = 1 ;
}
CClassFactory::~CClassFactory(void)
{
}
STDMETHODIMP CClassFactory::QueryInterface(REFIID riid, LPVOID *ppv)
{
if(IsEqualIID(riid, IID_IUnknown))
{
*ppv = static_cast<IUnknown*>(this);
AddRef( ) ;
return NOERROR;
}
else if(IsEqualIID(riid, IID_IClassFactory))
{
*ppv = static_cast<IClassFactory*>(this);
AddRef( ) ;
return NOERROR;
}
else
{
*ppv = NULL ;
return ResultFromScode(E_NOINTERFACE);
}
}
STDMETHODIMP_(ULONG) CClassFactory::AddRef(void)
{
return ++m_RefCount;
}
STDMETHODIMP_(ULONG) CClassFactory::Release(void)
{
m_RefCount -- ;
if (m_RefCount == 0)
{
delete this;
return 0 ;
}
return m_RefCount ;
}
STDMETHODIMP CClassFactory::CreateInstance(LPUNKNOWN pUnkOuter,
REFIID riid, LPVOID* ppvObj)
{
if (pUnkOuter != NULL)
{
*ppvObj = NULL ;
return ResultFromScode (CLASS_E_NOAGGREGATION) ;
}
CHello* pEliza = new CHello( ) ;
if(NULL == pEliza)
{
MessageBox(NULL,"Memory not enough","Error",MB_OK);
return S_FALSE;
}
else if (pEliza->QueryInterface (riid, ppvObj) != NOERROR)
{
pEliza->Release() ;
return E_NOINTERFACE ;
}
else
{
return NOERROR ;
}
}
STDMETHODIMP CClassFactory::LockServer(BOOL bLock)
{
if (bLock == TRUE)
LockCount ++ ;//全局变量
else
{
LockCount -- ;
if (LockCount == 0)
{
DestroyWindow (hMainWnd) ;
}
}
return NOERROR ;
}
界面是一个Win32的空窗体:
......
if (strstr (lpCmdLine, "-Embedding"))
{
LPCLASSFACTORY pCF = new CClassFactory ( ) ;
CoRegisterClassObject(__uuidof(CEliza), pCF,
CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE,
&dwRegister) ;
}
........
其余的没有列出,帮帮忙看看哪里错了?用.reg文件进行的注册,注册后的键值如下所示:
HKEY_CLASSES_ROOT\Hello = First Local Server
HKEY_CLASSES_ROOT\Hello\CLSID = {7D519041-1645-4a8c-BDE0-0F4A44FC38C4}
HKEY_CLASSES_ROOT\Hello\CLSID\LocalServer32 =D:\localserver.exe