/* * INOLE.H * * Master header file for all Inside OLE samples. * * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved * * Kraig Brockschmidt, Microsoft * Internet : kraigb@microsoft.com * Compuserve: >INTERNET:kraigb@microsoft.com */ #ifndef _INOLE_H_ #define _INOLE_H_ #define INC_OLE2 #include #include #include #ifdef INC_OLEUI #ifdef WIN32 /* * Comment the next line and remove the comment from the * line after it to compile for Windows NT 3.5. */ #include //#include #else #include #endif #endif #ifdef INC_CONTROLS #define INC_AUTOMATION #endif #ifdef INC_AUTOMATION #ifndef WIN32 #include #include #else #include #endif #endif #ifdef INC_CONTROLS #include #ifndef INITGUIDS #include #endif #endif #ifdef WIN32 //#include #ifdef UNICODE #include #endif #endif #ifndef WIN32 #include #include #endif #ifdef INC_CLASSLIB extern "C" { #include #ifndef WIN32 #include #include #endif } #include #endif //Types that OLE2.H et. al. leave out #ifndef PPVOID typedef LPVOID * PPVOID; #endif //PPVOID #ifdef _OLE2_H_ //May not include ole2.h at all times. #ifndef PPOINTL typedef POINTL * PPOINTL; #endif //PPOINTL #if !defined(_WIN32) && !defined(__CYGWIN__) #ifndef OLECHAR typedef char OLECHAR; typedef OLECHAR FAR* LPOLESTR; typedef const OLECHAR FAR* LPCOLESTR; #endif //OLECHAR #endif //_WIN32 //Useful macros. #define SETFormatEtc(fe, cf, asp, td, med, li) \ {\ (fe).cfFormat=cf;\ (fe).dwAspect=asp;\ (fe).ptd=td;\ (fe).tymed=med;\ (fe).lindex=li;\ } #define SETDefFormatEtc(fe, cf, med) \ {\ (fe).cfFormat=cf;\ (fe).dwAspect=DVASPECT_CONTENT;\ (fe).ptd=NULL;\ (fe).tymed=med;\ (fe).lindex=-1;\ } #define SETRECTL(rcl, l, t, r, b) \ {\ (rcl).left=l;\ (rcl).top=t;\ (rcl).right=r;\ (rcl).bottom=b;\ } #define SETSIZEL(szl, h, v) \ {\ (szl).cx=h;\ (szl).cy=v;\ } #define RECTLFROMRECT(rcl, rc)\ {\ (rcl).left=(long)(rc).left;\ (rcl).top=(long)(rc).top;\ (rcl).right=(long)(rc).right;\ (rcl).bottom=(long)(rc).bottom;\ } #define RECTFROMRECTL(rc, rcl)\ {\ (rc).left=(int)(rcl).left;\ (rc).top=(int)(rcl).top;\ (rc).right=(int)(rcl).right;\ (rc).bottom=(int)(rcl).bottom;\ } #define POINTLFROMPOINT(ptl, pt) \ { \ (ptl).x=(long)(pt).x; \ (ptl).y=(long)(pt).y; \ } #define POINTFROMPOINTL(pt, ptl) \ { \ (pt).x=(int)(ptl).x; \ (pt).y=(int)(ptl).y; \ } //Here's one that should be in windows.h #define SETPOINT(pt, h, v) \ {\ (pt).x=h;\ (pt).y=v;\ } #define SETPOINTL(ptl, h, v) \ {\ (ptl).x=h;\ (ptl).y=v;\ } #endif //_OLE2_H_ #ifdef INC_AUTOMATION //Macros for setting DISPPARAMS structures #define SETDISPPARAMS(dp, numArgs, pvArgs, numNamed, pNamed) \ {\ (dp).cArgs=numArgs;\ (dp).rgvarg=pvArgs;\ (dp).cNamedArgs=numNamed;\ (dp).rgdispidNamedArgs=pNamed;\ } #define SETNOPARAMS(dp) SETDISPPARAMS(dp, 0, NULL, 0, NULL) //Macros for setting EXCEPINFO structures #define SETEXCEPINFO(ei, excode, src, desc, file, ctx, func, scd) \ {\ (ei).wCode=excode;\ (ei).wReserved=0;\ (ei).bstrSource=src;\ (ei).bstrDescription=desc;\ (ei).bstrHelpFile=file;\ (ei).dwHelpContext=ctx;\ (ei).pvReserved=NULL;\ (ei).pfnDeferredFillIn=func;\ (ei).scode=scd;\ } #define INITEXCEPINFO(ei) \ SETEXCEPINFO(ei,0,NULL,NULL,NULL,0L,NULL,S_OK) #endif /* * State flags for IPersistStorage implementations. These * are kept here to avoid repeating the code in all samples. */ typedef enum { PSSTATE_UNINIT, //Uninitialized PSSTATE_SCRIBBLE, //Scribble PSSTATE_ZOMBIE, //No scribble PSSTATE_HANDSOFF //Hand-off } PSSTATE; /* * Identifers to describe which persistence model an object * is using, along with a union type that holds on the the * appropriate pointers that a client may need. */ typedef enum { PERSIST_UNKNOWN=0, PERSIST_STORAGE, PERSIST_STREAM, PERSIST_STREAMINIT, PERSIST_FILE } PERSIST_MODEL; typedef struct { PERSIST_MODEL psModel; union { IPersistStorage *pIPersistStorage; IPersistStream *pIPersistStream; #ifdef INC_CONTROLS IPersistStreamInit *pIPersistStreamInit; #endif IPersistFile *pIPersistFile; } pIP; } PERSISTPOINTER, *PPERSISTPOINTER; //To identify a storage in which to save, load, or create. typedef struct { PERSIST_MODEL psModel; union { IStorage *pIStorage; IStream *pIStream; } pIS; } STGPOINTER, *PSTGPOINTER; //Type for an object-destroyed callback typedef void (*PFNDESTROYED)(void); //DeleteInterfaceImp calls 'delete' and NULLs the pointer #define DeleteInterfaceImp(p)\ {\ if (NULL!=p)\ {\ delete p;\ p=NULL;\ }\ } //ReleaseInterface calls 'Release' and NULLs the pointer #define ReleaseInterface(p)\ {\ IUnknown *pt=(IUnknown *)p;\ p=NULL;\ if (NULL!=pt)\ pt->Release();\ } //OLE Documents Clipboard Formats #define CFSTR_EMBEDSOURCE TEXT("Embed Source") #define CFSTR_EMBEDDEDOBJECT TEXT("Embedded Object") #define CFSTR_LINKSOURCE TEXT("Link Source") #define CFSTR_CUSTOMLINKSOURCE TEXT("Custom Link Source") #define CFSTR_OBJECTDESCRIPTOR TEXT("Object Descriptor") #define CFSTR_LINKSRCDESCRIPTOR TEXT("Link Source Descriptor") //Functions in the helper DLL, INOLE.DLL //UI Effects STDAPI_(void) UIDrawHandles(LPRECT, HDC, DWORD, UINT, BOOL); STDAPI_(void) UIDrawShading(LPRECT, HDC, DWORD, UINT); STDAPI_(void) UIShowObject(LPCRECT, HDC, BOOL); //For UIDrawHandles #define UI_HANDLES_USEINVERSE 0x00000001L #define UI_HANDLES_NOBORDER 0x00000002L #define UI_HANDLES_INSIDE 0x00000004L #define UI_HANDLES_OUTSIDE 0x00000008L //For UIDrawShading #define UI_SHADE_FULLRECT 1 #define UI_SHADE_BORDERIN 2 #define UI_SHADE_BORDEROUT 3 //Coordinate Munging STDAPI_(int) XformWidthInHimetricToPixels(HDC, int); STDAPI_(int) XformWidthInPixelsToHimetric(HDC, int); STDAPI_(int) XformHeightInHimetricToPixels(HDC, int); STDAPI_(int) XformHeightInPixelsToHimetric(HDC, int); STDAPI_(void) XformRectInPixelsToHimetric(HDC, LPRECT, LPRECT); STDAPI_(void) XformRectInHimetricToPixels(HDC, LPRECT, LPRECT); STDAPI_(void) XformSizeInPixelsToHimetric(HDC, LPSIZEL, LPSIZEL); STDAPI_(void) XformSizeInHimetricToPixels(HDC, LPSIZEL, LPSIZEL); //Helpers STDAPI_(void) INOLE_MetafilePictIconFree(HGLOBAL); STDAPI INOLE_SetIconInCache(IUnknown *, HGLOBAL); STDAPI_(UINT) INOLE_GetUserTypeOfClass(REFCLSID, UINT, LPTSTR , UINT); STDAPI INOLE_DoConvert(IStorage *, REFCLSID); STDAPI_(LPTSTR) INOLE_CopyString(LPTSTR); STDAPI_(HGLOBAL) INOLE_ObjectDescriptorFromOleObject(IOleObject * , DWORD, POINTL, LPSIZEL); STDAPI_(HGLOBAL) INOLE_AllocObjectDescriptor(CLSID, DWORD , SIZEL, POINTL, DWORD, LPTSTR, LPTSTR); STDAPI_(IStorage *) INOLE_CreateStorageOnHGlobal(DWORD); STDAPI INOLE_GetLinkSourceData(IMoniker *, LPCLSID , LPFORMATETC, LPSTGMEDIUM); STDAPI_(void) INOLE_RegisterAsRunning(IUnknown *, IMoniker * , DWORD, LPDWORD); STDAPI_(void) INOLE_RevokeAsRunning(LPDWORD); STDAPI_(void) INOLE_NoteChangeTime(DWORD, FILETIME *, LPTSTR); /* * These are for ANSI compilations on Win32. Source code assumes * a Win32 Unicode environment (or Win16 Ansi). These macros * route Win32 ANSI compiled functions to wrappers which do the * proper Unicode conversion. */ #ifdef WIN32ANSI STDAPI INOLE_ConvertStringToANSI(LPCWSTR, LPSTR *); STDAPI INOLE_StringFromCLSID(REFCLSID, LPSTR *); STDAPI INOLE_StringFromGUID2(REFGUID, LPSTR, int); STDAPI INOLE_ProgIDFromCLSID(REFCLSID, LPSTR *); STDAPI INOLE_ReadFmtUserTypeStg(IStorage *, CLIPFORMAT *, LPSTR *); STDAPI INOLE_WriteFmtUserTypeStg(IStorage *, CLIPFORMAT, LPSTR); STDAPI INOLE_StgIsStorageFile(LPCSTR); STDAPI INOLE_StgCreateDocfile(LPCSTR, DWORD, DWORD, IStorage **); STDAPI INOLE_StgOpenStorage(LPCSTR, IStorage *, DWORD, SNB , DWORD, IStorage **); STDAPI INOLE_CreateFileMoniker(LPCSTR, LPMONIKER *); STDAPI INOLE_CreateItemMoniker(LPCSTR, LPCSTR, LPMONIKER *); STDAPI INOLE_MkParseDisplayName(LPBC, LPCSTR, ULONG *, LPMONIKER *); STDAPI INOLE_OleCreateLinkToFile(LPCSTR, REFIID, DWORD, LPFORMATETC , LPOLECLIENTSITE, LPSTORAGE, LPVOID *); STDAPI INOLE_OleCreateFromFile(REFCLSID, LPCSTR, REFIID , DWORD, LPFORMATETC, LPOLECLIENTSITE, LPSTORAGE, LPVOID *); #ifndef NOMACROREDIRECT #undef StringFromCLSID #define StringFromCLSID(c, pp) INOLE_StringFromCLSID(c, pp) #undef StringFromGUID2 #define StringFromGUID2(r, p, i) INOLE_StringFromGUID2(r, p, i) #undef ProgIDFromCLSID #define ProgIDFromCLSID(c, pp) INOLE_ProgIDFromCLSID(c, pp) #undef ReadFmtUserTypeStg #define ReadFmtUserTypeStg(p, c, s) INOLE_ReadFmtUserTypeStg(p, c, s) #undef WriteFmtUserTypeStg #define WriteFmtUserTypeStg(p, c, s) INOLE_WriteFmtUserTypeStg(p, c, s) #undef StgIsStorageFile #define StgIsStorageFile(s) INOLE_StgIsStorageFile(s) #undef StgCreateDocfile #define StgCreateDocfile(a, b, c, d) INOLE_StgCreateDocfile(a, b, c, d) #undef StgOpenStorage #define StgOpenStorage(a,b,c,d,e,f) INOLE_StgOpenStorage(a,b,c,d,e,f) #undef CreateFileMoniker #define CreateFileMoniker(p, i) INOLE_CreateFileMoniker(p, i) #undef CreateItemMoniker #define CreateItemMoniker(p1, p2, i) INOLE_CreateItemMoniker(p1, p2, i) #undef MkParseDisplayName #define MkParseDisplayName(b, p, u, i) INOLE_MkParseDisplayName(b, p, u, i) #undef OleCreateLinkToFile #define OleCreateLinkToFile(s, i, d, fe, cs, st, pv) INOLE_OleCreateLinkToFile(s, i, d, fe, cs, st, pv) #undef OleCreateFromFile #define OleCreateFromFile(c, s, i, d, fe, cs, st, pv) INOLE_OleCreateFromFile(c, s, i, d, fe, cs, st, pv) #endif #endif //Versioning. #define VERSIONMAJOR 2 #define VERSIONMINOR 0 #define VERSIONCURRENT 0x00020000 #define HIMETRIC_PER_INCH 2540 #define LOMETRIC_PER_INCH 254 #define LOMETRIC_BORDER 60 //Border around page #define CREATE_FAILED 0 #define CREATE_GRAPHICONLY 1 //State flags //CHAPTER24MOD //Switched #defines to an enum enum { TENANTSTATE_DEFAULT =0x00000000, TENANTSTATE_SELECTED=0x00000001, TENANTSTATE_OPEN =0x00000002, TENANTSTATE_SHOWTYPE=0x00000004, //New ones for controls. TENANTSTATE_CONTROL =0x00000100, TENANTSTATE_EVENTS =0x00000200, TENANTSTATE_BUTTON =0x00000400, TENANTSTATE_LABEL =0x00000800, TENANTSTATE_DEFBUTTON =0x00001000, TENANTSTATE_CANCELBUTTON=0x00002000 }; //To mask off non-control flags #define STATEMASK_CONTROLS 0xFFFFFF00 /* * Structures to save with the document describing the device * configuration and pages that we have. This is followed by * a list of DWORD IDs for the individual pages. */ typedef struct tagDEVICECONFIG { DWORD cb; //Size of structure TCHAR szDriver[CCHDEVICENAME]; TCHAR szDevice[CCHDEVICENAME]; TCHAR szPort[CCHDEVICENAME]; DWORD cbDevMode; //Size of actual DEVMODE DEVMODE dm; //Variable } DEVICECONFIG, *PDEVICECONFIG; //Offset to cbDevMode #define CBSEEKOFFSETCBDEVMODE (sizeof(DWORD) \ +(3*CCHDEVICENAME*sizeof(TCHAR))) //Combined OLE and Patron device structures. typedef struct tagCOMBINEDEVICE { DVTARGETDEVICE td; DEVICECONFIG dc; } COMBINEBDEVICE, *PCOMBINEDEVICE; void RectConvertMappings(LPRECT, HDC, BOOL); //CHAPTER24MOD #ifdef WIN32 #define PROP_POINTER TEXT("Pointer") #else #define PROP_SELECTOR "Selector" #define PROP_OFFSET "Offset" #endif //End CHAPTER24MOD BOOL ObjectEventsIID(LPUNKNOWN pObj, IID *piid); BOOL InterfaceConnect(LPUNKNOWN pObj, REFIID riid , LPUNKNOWN pIUnknownSink, LPDWORD pdwConn); BOOL InterfaceDisconnect(LPUNKNOWN pObj, REFIID riid , LPDWORD pdwConn); BOOL ObjectTypeInfo(LPUNKNOWN pObj, LPTYPEINFO *ppITypeInfo); BOOL ObjectTypeInfoEvents(LPUNKNOWN pObj, LPTYPEINFO *ppITypeInfo); BOOL ObjectEventsIID(LPUNKNOWN pObj, IID *piid); #define HIMETRIC_PER_INCH 2540 //Number HIMETRIC units per inch #define PTS_PER_INCH 72 //Number points (font size) per inch #define MAP_PIX_TO_LOGHIM(x,ppli) MulDiv(HIMETRIC_PER_INCH, (x), (ppli)) #define MAP_LOGHIM_TO_PIX(x,ppli) MulDiv((ppli), (x), HIMETRIC_PER_INCH) //Useful macros. #define SETFormatEtc(fe, cf, asp, td, med, li) \ {\ (fe).cfFormat=cf;\ (fe).dwAspect=asp;\ (fe).ptd=td;\ (fe).tymed=med;\ (fe).lindex=li;\ } STDAPI_(void) XformRectInHimetricToPixels(HDC hDC, LPRECT prcHiMetric , LPRECT prcPix); #endif //_INOLE_H_