#include "OleAut.h" static ITypeLib *s_pTypeLib = NULL; BOOL __stdcall DllMain(HANDLE hModule, DWORD Reason, void *Reserved) { switch(Reason) { case DLL_PROCESS_ATTACH: return !LoadRegTypeLib(g_IID_Library, g_MajVerNo, g_MinVerNo, g_LCID, &s_pTypeLib); case DLL_PROCESS_DETACH: s_pTypeLib->Release(); return TRUE; } return TRUE; } VirtualDestructor::~VirtualDestructor() {} SimpleDispatch::SimpleDispatch() {m_refs = 1;} HRESULT __stdcall SimpleDispatch::QueryInterface(REFIID riid, void **ppv) { if (riid == IID_IUnknown || riid == IID_IDispatch || riid == IID_This()) { *ppv = this; AddRef(); return NOERROR; } *ppv = NULL; return ResultFromScode(E_NOINTERFACE); } unsigned long __stdcall SimpleDispatch::AddRef(void) {return m_refs++;} unsigned long __stdcall SimpleDispatch::Release(void) { if (--m_refs > 0) return m_refs; delete this; return 0; } HRESULT __stdcall SimpleDispatch::GetTypeInfoCount(unsigned int *pctinfo) {*pctinfo = 1; return NOERROR;} HRESULT __stdcall SimpleDispatch::GetTypeInfo(unsigned int itinfo, LCID lcid, ITypeInfo **pptinfo) { return s_pTypeLib->GetTypeInfoOfGuid(IID_This(), pptinfo); } HRESULT __stdcall SimpleDispatch::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, unsigned int cNames, LCID lcid, DISPID *rgdispid) { ITypeInfo *TI; HRESULT hRes; if (hRes = GetTypeInfo(0, 0, &TI)) return hRes; hRes = DispGetIDsOfNames(TI, rgszNames, cNames, rgdispid); TI->Release(); return hRes; } HRESULT __stdcall SimpleDispatch::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, unsigned short wFlags, DISPPARAMS *pdispparams, VARIANT *pvarResult, EXCEPINFO *pexcepinfo, unsigned int *puArgErr) { ITypeInfo *TI; HRESULT hRes; if (hRes = GetTypeInfo(0, 0, &TI)) return hRes; hRes = DispInvoke(this, TI, dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr); TI->Release(); return hRes; }