module std.c.windows.com; private import std.c.windows.windows; private import std.string; alias WCHAR OLECHAR; alias OLECHAR *LPOLESTR; alias OLECHAR *LPCOLESTR; enum { rmm = 23, // OLE 2 version number info rup = 639, } enum : int { S_OK = 0, S_FALSE = 0x00000001, NOERROR = 0, E_NOTIMPL = cast(int)0x80004001, E_NOINTERFACE = cast(int)0x80004002, E_POINTER = cast(int)0x80004003, E_ABORT = cast(int)0x80004004, E_FAIL = cast(int)0x80004005, E_HANDLE = cast(int)0x80070006, CLASS_E_NOAGGREGATION = cast(int)0x80040110, E_OUTOFMEMORY = cast(int)0x8007000E, E_INVALIDARG = cast(int)0x80070057, E_UNEXPECTED = cast(int)0x8000FFFF, } struct GUID { // size is 16 align(1): DWORD Data1; WORD Data2; WORD Data3; BYTE Data4[8]; } enum { CLSCTX_INPROC_SERVER = 0x1, CLSCTX_INPROC_HANDLER = 0x2, CLSCTX_LOCAL_SERVER = 0x4, CLSCTX_INPROC_SERVER16 = 0x8, CLSCTX_REMOTE_SERVER = 0x10, CLSCTX_INPROC_HANDLER16 = 0x20, CLSCTX_INPROC_SERVERX86 = 0x40, CLSCTX_INPROC_HANDLERX86 = 0x80, CLSCTX_INPROC = (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER), CLSCTX_ALL = (CLSCTX_INPROC_SERVER| CLSCTX_INPROC_HANDLER| CLSCTX_LOCAL_SERVER), CLSCTX_SERVER = (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER), } alias GUID IID; alias GUID CLSID; extern (C) { extern IID IID_IUnknown; extern IID IID_IClassFactory; extern IID IID_IMarshal; extern IID IID_IMallocSpy; extern IID IID_IStdMarshalInfo; extern IID IID_IExternalConnection; extern IID IID_IMultiQI; extern IID IID_IEnumUnknown; extern IID IID_IBindCtx; extern IID IID_IEnumMoniker; extern IID IID_IRunnableObject; extern IID IID_IRunningObjectTable; extern IID IID_IPersist; extern IID IID_IPersistStream; extern IID IID_IMoniker; extern IID IID_IROTData; extern IID IID_IEnumString; extern IID IID_ISequentialStream; extern IID IID_IStream; extern IID IID_IEnumSTATSTG; extern IID IID_IStorage; extern IID IID_IPersistFile; extern IID IID_IPersistStorage; extern IID IID_ILockBytes; extern IID IID_IEnumFORMATETC; extern IID IID_IEnumSTATDATA; extern IID IID_IRootStorage; extern IID IID_IAdviseSink; extern IID IID_IAdviseSink2; extern IID IID_IDataObject; extern IID IID_IDataAdviseHolder; extern IID IID_IMessageFilter; extern IID IID_IRpcChannelBuffer; extern IID IID_IRpcProxyBuffer; extern IID IID_IRpcStubBuffer; extern IID IID_IPSFactoryBuffer; extern IID IID_IPropertyStorage; extern IID IID_IPropertySetStorage; extern IID IID_IEnumSTATPROPSTG; extern IID IID_IEnumSTATPROPSETSTG; extern IID IID_IFillLockBytes; extern IID IID_IProgressNotify; extern IID IID_ILayoutStorage; extern IID GUID_NULL; extern IID IID_IRpcChannel; extern IID IID_IRpcStub; extern IID IID_IStubManager; extern IID IID_IRpcProxy; extern IID IID_IProxyManager; extern IID IID_IPSFactory; extern IID IID_IInternalMoniker; extern IID IID_IDfReserved1; extern IID IID_IDfReserved2; extern IID IID_IDfReserved3; extern IID IID_IStub; extern IID IID_IProxy; extern IID IID_IEnumGeneric; extern IID IID_IEnumHolder; extern IID IID_IEnumCallback; extern IID IID_IOleManager; extern IID IID_IOlePresObj; extern IID IID_IDebug; extern IID IID_IDebugStream; extern IID IID_StdOle; extern IID IID_ICreateTypeInfo; extern IID IID_ICreateTypeInfo2; extern IID IID_ICreateTypeLib; extern IID IID_ICreateTypeLib2; extern IID IID_IDispatch; extern IID IID_IEnumVARIANT; extern IID IID_ITypeComp; extern IID IID_ITypeInfo; extern IID IID_ITypeInfo2; extern IID IID_ITypeLib; extern IID IID_ITypeLib2; extern IID IID_ITypeChangeEvents; extern IID IID_IErrorInfo; extern IID IID_ICreateErrorInfo; extern IID IID_ISupportErrorInfo; extern IID IID_IOleAdviseHolder; extern IID IID_IOleCache; extern IID IID_IOleCache2; extern IID IID_IOleCacheControl; extern IID IID_IParseDisplayName; extern IID IID_IOleContainer; extern IID IID_IOleClientSite; extern IID IID_IOleObject; extern IID IID_IOleWindow; extern IID IID_IOleLink; extern IID IID_IOleItemContainer; extern IID IID_IOleInPlaceUIWindow; extern IID IID_IOleInPlaceActiveObject; extern IID IID_IOleInPlaceFrame; extern IID IID_IOleInPlaceObject; extern IID IID_IOleInPlaceSite; extern IID IID_IContinue; extern IID IID_IViewObject; extern IID IID_IViewObject2; extern IID IID_IDropSource; extern IID IID_IDropTarget; extern IID IID_IEnumOLEVERB; } extern (Windows) { export { DWORD CoBuildVersion(); int StringFromGUID2(GUID *rguid, LPOLESTR lpsz, int cbMax); /* init/uninit */ HRESULT CoInitialize(LPVOID pvReserved); void CoUninitialize(); DWORD CoGetCurrentProcess(); HRESULT CoCreateInstance(CLSID *rclsid, IUnknown UnkOuter, DWORD dwClsContext, IID* riid, void* ppv); //HINSTANCE CoLoadLibrary(LPOLESTR lpszLibName, BOOL bAutoFree); void CoFreeLibrary(HINSTANCE hInst); void CoFreeAllLibraries(); void CoFreeUnusedLibraries(); } interface IUnknown { HRESULT QueryInterface(IID* riid, void** pvObject); ULONG AddRef(); ULONG Release(); } interface IClassFactory : IUnknown { HRESULT CreateInstance(IUnknown UnkOuter, IID* riid, void** pvObject); HRESULT LockServer(BOOL fLock); } class ComObject : IUnknown { extern (Windows): HRESULT QueryInterface(IID* riid, void** ppv) { if (*riid == IID_IUnknown) { *ppv = (IUnknown)this; AddRef(); return S_OK; } else { *ppv = null; return E_NOINTERFACE; } } ULONG AddRef() { return InterlockedIncrement(&count); } ULONG Release() { LONG lRef = InterlockedDecrement(&count); if (lRef == 0) { // free object // If we delete this object, then the postinvariant called upon // return from Release() will fail. // Just let the GC reap it. //delete this; return 0; } return (ULONG)lRef; } LONG count = 0; // object reference count } }