📄 component.cpp
字号:
// component.cpp
#include <iostream.h>
#include "Component\component.h" // Generated by MIDL
#include "registry.h" // Add This!!!
HINSTANCE g_hInstance;
long g_cComponents = 0;
long g_cServerLocks = 0;
class CTestIDL : public IPointerTest
{
public:
// IUnknown
ULONG __stdcall AddRef();
ULONG __stdcall Release();
HRESULT __stdcall QueryInterface(REFIID iid, void** ppv);
// IPointerTest
HRESULT __stdcall GetInterfacePointer1(void** ppv);
HRESULT __stdcall GetInterfacePointer2(REFIID riid, IUnknown** ppv);
HRESULT __stdcall GetInterfacePointer3(IPointerTest** ppv);
HRESULT __stdcall GetInterfacePointer4(REFIID riid, void** ppv);
CTestIDL() : m_cRef(0) { g_cComponents++; }
~CTestIDL() { cout << "Component: CTestIDL::~CTestIDL()" << endl, g_cComponents--; }
private:
long m_cRef;
};
ULONG __stdcall CTestIDL::AddRef()
{
cout << "Component: CTestIDL::AddRef() m_cRef = " << m_cRef + 1 << endl;
return ++m_cRef;
}
ULONG __stdcall CTestIDL::Release()
{
cout << "Component: CTestIDL::Release() m_cRef = " << m_cRef - 1 << endl;
if(--m_cRef == 0)
{
delete this;
return 0;
}
return m_cRef;
}
HRESULT __stdcall CTestIDL::QueryInterface(REFIID iid, void** ppv)
{
if(iid == IID_IUnknown)
{
cout << "Component: CTestIDL::QueryInterface() for IUnknown returning " << this << endl;
*ppv = reinterpret_cast<IUnknown*>(this);
}
else if(iid == IID_IPointerTest)
{
cout << "Component: CTestIDL::QueryInterface() for ISum returning " << this << endl;
*ppv = (IPointerTest*)this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
//[local] HRESULT GetInterfacePointer1([out] void** ppv);
HRESULT CTestIDL::GetInterfacePointer1(void** ppv)
{
return QueryInterface(IID_IPointerTest, ppv);
}
// HRESULT GetInterfacePointer2([in] REFIID riid, [out, iid_is(riid)] IUnknown** ppv);
HRESULT CTestIDL::GetInterfacePointer2(REFIID riid, IUnknown** ppv)
{
return QueryInterface(riid, (void**)ppv);
}
// HRESULT GetInterfacePointer3([out] IPointerTest** ppv);
HRESULT CTestIDL::GetInterfacePointer3(IPointerTest** ppv)
{
return QueryInterface(IID_IPointerTest, (void**)ppv);
}
// [local] HRESULT GetInterfacePointer4([in] REFIID riid, [out, iid_is(riid)] void** ppv);
// [call_as(GetInterfacePointer4)] HRESULT RemoteGetInterfacePointer4([in] REFIID riid, [out, iid_is(riid)] IUnknown** ppv);
HRESULT CTestIDL::GetInterfacePointer4(REFIID riid, void** ppv)
{
return QueryInterface(riid, (void**)ppv);
}
class CFactory : public IClassFactory
{
public:
// IUnknown
ULONG __stdcall AddRef();
ULONG __stdcall Release();
HRESULT __stdcall QueryInterface(REFIID iid, void** ppv);
// IClassFactory
HRESULT __stdcall CreateInstance(IUnknown *pUnknownOuter, REFIID iid, void** ppv);
HRESULT __stdcall LockServer(BOOL bLock);
CFactory() : m_cRef(0) { }
~CFactory() { }
private:
long m_cRef;
};
ULONG __stdcall CFactory::AddRef()
{
cout << "Component: CFactory::AddRef() m_cRef = " << m_cRef + 1 << endl;
return ++m_cRef;
}
ULONG __stdcall CFactory::Release()
{
cout << "Component: CFactory::Release() m_cRef = " << m_cRef - 1 << endl;
if(--m_cRef == 0)
{
delete this;
return 0;
}
return m_cRef;
}
HRESULT __stdcall CFactory::QueryInterface(REFIID iid, void** ppv)
{
if((iid == IID_IUnknown) || (iid == IID_IClassFactory))
{
cout << "Component: CFactory::QueryInteface() for IUnknown or IClassFactory " << this << endl;
*ppv = (IClassFactory *)this;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
HRESULT __stdcall CFactory::CreateInstance(IUnknown *pUnknownOuter, REFIID iid, void** ppv)
{
if(pUnknownOuter != NULL)
return CLASS_E_NOAGGREGATION;
CTestIDL *pTestIDL = new CTestIDL;
cout << "Component: CFactory::CreateInstance() " << pTestIDL << endl;
if(pTestIDL == NULL)
return E_OUTOFMEMORY;
// QueryInterface probably for IID_IUNKNOWN
HRESULT hr = pTestIDL->QueryInterface(iid, ppv);
return hr;
}
HRESULT __stdcall CFactory::LockServer(BOOL bLock)
{
bLock ? g_cServerLocks++ : g_cServerLocks--;
return S_OK;
}
HRESULT __stdcall DllCanUnloadNow()
{
cout << "Component: DllCanUnloadNow() " << (g_cServerLocks == 0 && g_cComponents == 0 ? "Yes" : "No") << endl;
if(g_cServerLocks == 0 && g_cComponents == 0)
return S_OK;
else
return S_FALSE;
}
HRESULT __stdcall DllGetClassObject(REFCLSID clsid, REFIID iid, void** ppv)
{
cout << "Component: DllGetClassObject" << endl;
if(clsid != CLSID_PointerTest)
return CLASS_E_CLASSNOTAVAILABLE;
CFactory* pFactory = new CFactory;
if(pFactory == NULL)
return E_OUTOFMEMORY;
// QueryInterface probably for IClassFactory
HRESULT hr = pFactory->QueryInterface(iid, ppv);
return hr;
}
HRESULT __stdcall DllRegisterServer()
{
char DllPath[256];
OLECHAR wDllPath[256];
GetModuleFileName(g_hInstance, DllPath, 256);
mbstowcs(wDllPath, DllPath, 256);
ITypeLib* pTypeLib;
HRESULT hr = LoadTypeLibEx(wDllPath, REGKIND_REGISTER, &pTypeLib);
if(FAILED(hr))
return hr;
pTypeLib->Release();
return RegisterServer("component.dll", CLSID_PointerTest, "Inside COM+ Sample", "Component.InterfacePointer", "Component.InterfacePointer.1", NULL);
}
HRESULT __stdcall DllUnregisterServer()
{
HRESULT hr = UnRegisterTypeLib(LIBID_Component, 1, 0, LANG_NEUTRAL, SYS_WIN32);
if(FAILED(hr))
return hr;
return UnregisterServer(CLSID_PointerTest, "Component.InterfacePointer", "Component.InterfacePointer.1");
}
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, void* pv)
{
g_hInstance = hInstance;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -