3,245
社区成员
发帖
与我相关
我的任务
分享
import "unknwn.idl";
[object, uuid(e1893788-31b1-4a20-8e5a-c765c8272e75)]
interface ICalc : IUnknown
{
HRESULT Add(int a, int b, int* result);
HRESULT Sub(int a, int b, int* result);
}
[
uuid(3ab7610a-a3eb-4101-822e-0557aef8de14),
version(1.0),
helpstring("Math Library")
]
library MathLib
{
importlib("stdole32.tlb");
[uuid(4994511e-a14d-4192-a1ff-9c4259c95bcd)]
coclass Math
{
interface ICalc;
}
}
extern const IID IID_ICalc;
class ICalc : public IUnknown
{
public:
virtual HRESULT __stdcall Add( int a, int b, int *result) = 0;
virtual HRESULT __stdcall Sub( int a, int b, int *result) = 0;
};
class Calc : public ICalc
{
protected:
long m_lRef;
public:
Calc();
virtual HRESULT __stdcall QueryInterface( REFIID riid, void **ppvObject );
virtual ULONG __stdcall AddRef( void);
virtual ULONG __stdcall Release( void);
virtual HRESULT __stdcall Add( int a, int b, int *result);
virtual HRESULT __stdcall Sub( int a, int b, int *result);
};
class Math : public IClassFactory
{
public:
virtual HRESULT __stdcall QueryInterface( REFIID riid, void **ppvObject );
virtual ULONG __stdcall AddRef( void);
virtual ULONG __stdcall Release( void);
virtual HRESULT __stdcall CreateInstance( IUnknown *pUnkOuter, REFIID riid, void **ppvObject);
virtual HRESULT __stdcall LockServer( BOOL fLock);
};
extern const IID LIBID_MathLib;
extern const CLSID CLSID_Math;
...
HRESULT __stdcall Calc::QueryInterface( REFIID riid, void **ppvObject )
{
printf("Calc::QueryInterface\n");
if ( riid == IID_ICalc || riid == IID_IUnknown )
{
AddRef();
*ppvObject = this;
return S_OK;
}
return E_NOINTERFACE;
}
...
HRESULT __stdcall Math::CreateInstance( IUnknown *pUnkOuter, REFIID riid, void **ppvObject )
{
printf("Math::CreateInstance\n");
Calc* p = new Calc();
HRESULT hr = p->QueryInterface(riid, ppvObject);
if ( SUCCEEDED(hr) )
{
return S_OK;
}
delete p;
p = NULL;
return E_NOINTERFACE;
}
...
HRESULT __stdcall Math::QueryInterface( REFIID riid, void **ppvObject )
{
printf("Math::QueryInterface\n");
if ( riid == IID_IClassFactory || riid == IID_IUnknown )
{
*ppvObject = this;
AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
...
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
Math oMath;
printf("begin register class object...");
DWORD dwRegister = 0;
HRESULT hr = CoRegisterClassObject(CLSID_Math, &oMath, CLSCTX_LOCAL_SERVER, REGCLS_MULTI_SEPARATE, &dwRegister );
if (FAILED(hr))
{
printf("register failed, HR=%X\n", hr);
getch();
return 0;
}
MSG msg;
while (GetMessage(&msg,0,0,0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
CoRevokeClassObject(dwRegister);
::CoUninitialize();