334 lines
10 KiB
C
334 lines
10 KiB
C
|
/*
|
||
|
OLE SERVER DEMO
|
||
|
SrvrDemo.h
|
||
|
|
||
|
This file contains typedefs, defines, global variable declarations, and
|
||
|
function prototypes.
|
||
|
|
||
|
(c) Copyright Microsoft Corp. 1990 - 1992 All Rights Reserved
|
||
|
*/
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
Explanation of Function Comments.
|
||
|
|
||
|
Every function has a comment preceding it which gives the following
|
||
|
information:
|
||
|
|
||
|
1) Function name.
|
||
|
2) A description of what the function does.
|
||
|
3) A list of parameters, each with its type and a short description.
|
||
|
4) A list of return values, each with an explanation of the condition that
|
||
|
will cause the function to return that value.
|
||
|
5) A customization section giving tips on how to customize this function
|
||
|
for your OLE application.
|
||
|
If the customization section says "None" then you may find the function
|
||
|
usable as is.
|
||
|
If the customization section says "Re-implement" then the function
|
||
|
should still serve the same purpose and do what is indicated in the
|
||
|
function comment, but will probably need to be re-implemented for
|
||
|
your particular application. Any Server Demo code relating to OLE
|
||
|
will be useful as a guide in your re-implementation.
|
||
|
If the customization section says "Server Demo specific" then the
|
||
|
function will probably have no counterpart in your application.
|
||
|
*/
|
||
|
|
||
|
|
||
|
/* Menu Identifiers */
|
||
|
|
||
|
// File menu
|
||
|
|
||
|
#define IDM_NEW 100
|
||
|
#define IDM_OPEN 101
|
||
|
#define IDM_SAVE 102
|
||
|
#define IDM_SAVEAS 103
|
||
|
#define IDM_EXIT 104
|
||
|
#define IDM_ABOUT 105
|
||
|
#define IDM_UPDATE 106
|
||
|
|
||
|
// Edit menu
|
||
|
|
||
|
#define IDM_CUT 107
|
||
|
#define IDM_COPY 108
|
||
|
#define IDM_DELETE 109
|
||
|
|
||
|
// Color menu
|
||
|
|
||
|
#define IDM_RED 110
|
||
|
#define IDM_GREEN 111
|
||
|
#define IDM_BLUE 112
|
||
|
#define IDM_WHITE 113
|
||
|
#define IDM_GRAY 114
|
||
|
#define IDM_CYAN 115
|
||
|
#define IDM_MAGENTA 116
|
||
|
#define IDM_YELLOW 117
|
||
|
|
||
|
// New object menu
|
||
|
|
||
|
#define IDM_NEWOBJ 118
|
||
|
#define IDM_NEXTOBJ 119
|
||
|
|
||
|
#define IDD_CONTINUEEDIT 120
|
||
|
#define IDD_UPDATEEXIT 121
|
||
|
#define IDD_TEXT 122
|
||
|
|
||
|
#define OBJECT_WIDTH 120
|
||
|
#define OBJECT_HEIGHT 60
|
||
|
|
||
|
// number HIMETRIC units per inch
|
||
|
#define HIMETRIC_PER_INCH 2540
|
||
|
|
||
|
/* Types */
|
||
|
|
||
|
// Document type
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
doctypeNew, // The document is untitled.
|
||
|
doctypeFromFile, // The document exists in a file and may be linked.
|
||
|
doctypeEmbedded // The document is an embedded document.
|
||
|
} DOCTYPE;
|
||
|
|
||
|
|
||
|
// Device context type, passed to DrawObj.
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
dctypeScreen,
|
||
|
dctypeBitmap,
|
||
|
dctypeMetafile,
|
||
|
dctypeEnhMetafile
|
||
|
} DCTYPE ;
|
||
|
|
||
|
|
||
|
// Version
|
||
|
|
||
|
typedef WORD VERSION;
|
||
|
|
||
|
|
||
|
// Verb
|
||
|
|
||
|
typedef enum
|
||
|
{
|
||
|
verbPlay = OLEVERB_PRIMARY,
|
||
|
verbEdit
|
||
|
} VERB;
|
||
|
|
||
|
|
||
|
// Server structure
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
OLESERVER olesrvr; // This must be the first field so that
|
||
|
// an LPOLESERVER can be cast to a SRVR*.
|
||
|
LHSERVER lhsrvr; // Registration handle
|
||
|
} SRVR ;
|
||
|
|
||
|
|
||
|
// How many objects (distinct numbers) will we allow?
|
||
|
#define cfObjNums 20
|
||
|
|
||
|
// How many distinct clients can be associated with the object?
|
||
|
#define clpoleclient 20
|
||
|
|
||
|
|
||
|
// Document structure
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
OLESERVERDOC oledoc; // This must be the first field so that an
|
||
|
// LPOLESERVERDOC can be cast to an DOC*.
|
||
|
LHSERVERDOC lhdoc; // Registration handle
|
||
|
DOCTYPE doctype; // Document type
|
||
|
ATOM aName; // Document name
|
||
|
HPALETTE hpal; // Handle to a logical color palette
|
||
|
BYTE rgfObjNums[cfObjNums+1]; // What object numbers have been used
|
||
|
} DOC, *DOCPTR ;
|
||
|
|
||
|
|
||
|
// Native data structure
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
INT idmColor;
|
||
|
INT nWidth;
|
||
|
INT nHeight;
|
||
|
INT nX;
|
||
|
INT nY;
|
||
|
INT nHiMetricWidth; // Used by an object handler. These two fields
|
||
|
INT nHiMetricHeight; // always correspond to nWidth and nHeight.
|
||
|
VERSION version;
|
||
|
CHAR szName[10]; // "Object nn"
|
||
|
} NATIVE, FAR *LPNATIVE;
|
||
|
|
||
|
|
||
|
// Object structure
|
||
|
|
||
|
/* Ordinarily, an OBJ structure would not contain native data. Rather, it
|
||
|
would contain a pointer (or some other reference) to the native data.
|
||
|
This method would allow multiple objects containing the same native data.
|
||
|
Each OBJ structure would be created on the fly when some portion of the
|
||
|
document was to be made into an object. Each OBJ structure would have
|
||
|
only one LPOLECLIENT, which would be passed in to DocGetObject.
|
||
|
*/
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
OLEOBJECT oleobject; // This must be the first field so that an
|
||
|
// LPOLEOBJECT can be cast to a LPOBJ.
|
||
|
HANDLE hObj; // A circular handle to this structure,
|
||
|
// used to delete this structure.
|
||
|
LPOLECLIENT lpoleclient[clpoleclient];
|
||
|
// Clients associated with the object.
|
||
|
// The array is NULL terminated.
|
||
|
HWND hwnd; // The object's own window
|
||
|
ATOM aName; // Unique identifier for each object within a doc
|
||
|
HPALETTE hpal; // Logical palette to use in drawing object
|
||
|
NATIVE native; // Object data in native format
|
||
|
} OBJ, FAR *LPOBJ ;
|
||
|
|
||
|
typedef struct {
|
||
|
CHAR *pClassName;
|
||
|
CHAR *pFileSpec;
|
||
|
CHAR *pHumanReadable;
|
||
|
CHAR *pExeName;
|
||
|
} CLASS_STRINGS;
|
||
|
|
||
|
|
||
|
|
||
|
/* Defines */
|
||
|
|
||
|
// The name of the application, used in message boxes and title bars.
|
||
|
#define szAppName "Server Demo10"
|
||
|
|
||
|
// THe class name in the registration database.
|
||
|
#define szClassName "SrvrDemo10"
|
||
|
|
||
|
// Used to check for "-Embedding" on command line.
|
||
|
#define szEmbeddingFlag "Embedding"
|
||
|
|
||
|
// Maximum length of a fully-qualified pathname.
|
||
|
#define cchFilenameMax 256
|
||
|
|
||
|
// Maximum number of HBRUSHes.
|
||
|
#define chbrMax 9
|
||
|
|
||
|
// Number of extra bytes in the window structure for an object
|
||
|
#define cbWindExtra 4
|
||
|
|
||
|
// Offset (in the extra space) of the pointer to the object
|
||
|
#define ibLpobj 0
|
||
|
|
||
|
|
||
|
|
||
|
/* Global variable declarations. (See SrvrDemo.c for descriptions.) */
|
||
|
|
||
|
extern HANDLE hInst;
|
||
|
extern HWND hwndMain;
|
||
|
extern SRVR srvrMain;
|
||
|
extern DOC docMain;
|
||
|
extern BOOL fDocChanged;
|
||
|
extern BOOL fEmbedding;
|
||
|
extern BOOL fRevokeSrvrOnSrvrRelease;
|
||
|
extern BOOL fWaitingForDocRelease;
|
||
|
extern BOOL fWaitingForSrvrRelease;
|
||
|
extern BOOL fUnblock;
|
||
|
extern CHAR szClient[];
|
||
|
extern CHAR szClientDoc[];
|
||
|
extern HBRUSH hbrColor[chbrMax];
|
||
|
extern VERSION version;
|
||
|
extern OLECLIPFORMAT cfObjectLink;
|
||
|
extern OLECLIPFORMAT cfOwnerLink;
|
||
|
extern OLECLIPFORMAT cfNative;
|
||
|
extern OLESERVERDOCVTBL docvtbl;
|
||
|
extern OLEOBJECTVTBL objvtbl;
|
||
|
extern OLESERVERVTBL srvrvtbl;
|
||
|
|
||
|
|
||
|
|
||
|
/* Function Prototypes */
|
||
|
|
||
|
// Various functions
|
||
|
|
||
|
BOOL CreateDocFromFile (LPSTR lpszDoc, LHSERVERDOC lhdoc, DOCTYPE doctype);
|
||
|
BOOL CreateNewDoc (LONG lhdoc, LPSTR lpszDoc, DOCTYPE doctype);
|
||
|
LPOBJ CreateNewObj (BOOL fDoc_Changed);
|
||
|
VOID CutOrCopyObj (BOOL fOpIsCopy);
|
||
|
VOID DestroyDoc (VOID);
|
||
|
VOID DestroyObj (HWND hwnd);
|
||
|
VOID DeviceToHiMetric ( LPPOINT lppt);
|
||
|
VOID EmbeddingModeOff (VOID) ;
|
||
|
VOID EmbeddingModeOn (VOID);
|
||
|
VOID UpdateFileMenu (INT);
|
||
|
VOID ErrorBox (CHAR *jwf);
|
||
|
BOOL GetFileOpenFilename (LPSTR lpszFilename);
|
||
|
BOOL GetFileSaveFilename (LPSTR lpszFilename);
|
||
|
VOID HiMetricToDevice ( LPPOINT lppt);
|
||
|
LPOBJ HwndToLpobj (HWND hwndObj);
|
||
|
BOOL InitServer (HWND hwnd, HANDLE hInst);
|
||
|
VOID InitVTbls (VOID);
|
||
|
BOOL OpenDoc (VOID);
|
||
|
VOID PaintObj (HWND hwnd);
|
||
|
OLESTATUS RevokeDoc (VOID);
|
||
|
VOID RevokeObj (LPOBJ lpobj);
|
||
|
INT SaveChangesOption (BOOL *pfUpdateLater);
|
||
|
BOOL SaveDoc (VOID);
|
||
|
BOOL SaveDocAs (VOID);
|
||
|
VOID SavedServerDoc (VOID);
|
||
|
LPOBJ SelectedObject (VOID);
|
||
|
HWND SelectedObjectWindow (VOID);
|
||
|
VOID SendDocMsg (WORD wMessage );
|
||
|
VOID SendObjMsg (LPOBJ lpobj, WORD wMessage);
|
||
|
VOID SetTitle (LPSTR lpszDoc, BOOL bEmbedded);
|
||
|
VOID SetHiMetricFields (LPOBJ lpobj);
|
||
|
VOID SizeClientArea (HWND hwndMain, RECT rectReq, BOOL fFrame);
|
||
|
VOID SizeObj (HWND hwnd, RECT rect, BOOL fMove);
|
||
|
OLESTATUS StartRevokingServer (VOID);
|
||
|
VOID Wait (BOOL *pf);
|
||
|
LPSTR Abbrev (LPSTR lpsz);
|
||
|
BOOL APIENTRY fnFailedUpdate (HWND, UINT, WPARAM, LONG);
|
||
|
int Main(USHORT argc, CHAR **argv) ;
|
||
|
|
||
|
// Window handlers
|
||
|
|
||
|
BOOL APIENTRY About (HWND, UINT, WPARAM, LPARAM);
|
||
|
LONG APIENTRY MainWndProc (HWND, UINT, WPARAM, LPARAM);
|
||
|
LONG APIENTRY ObjWndProc (HWND, UINT, WPARAM, LPARAM);
|
||
|
|
||
|
|
||
|
// Server methods
|
||
|
|
||
|
OLESTATUS APIENTRY SrvrCreate (LPOLESERVER, LHSERVERDOC, OLE_LPCSTR, OLE_LPCSTR, LPOLESERVERDOC FAR *);
|
||
|
OLESTATUS APIENTRY SrvrCreateFromTemplate (LPOLESERVER, LHSERVERDOC, OLE_LPCSTR, OLE_LPCSTR, OLE_LPCSTR, LPOLESERVERDOC FAR *);
|
||
|
OLESTATUS APIENTRY SrvrEdit (LPOLESERVER, LHSERVERDOC, OLE_LPCSTR, OLE_LPCSTR, LPOLESERVERDOC FAR * );
|
||
|
OLESTATUS APIENTRY SrvrExecute (LPOLESERVER, HANDLE);
|
||
|
OLESTATUS APIENTRY SrvrExit (LPOLESERVER);
|
||
|
OLESTATUS APIENTRY SrvrOpen (LPOLESERVER, LHSERVERDOC, OLE_LPCSTR, LPOLESERVERDOC FAR *);
|
||
|
OLESTATUS APIENTRY SrvrRelease (LPOLESERVER);
|
||
|
|
||
|
// Document methods
|
||
|
|
||
|
OLESTATUS APIENTRY DocClose (LPOLESERVERDOC);
|
||
|
OLESTATUS APIENTRY DocExecute (LPOLESERVERDOC, HANDLE);
|
||
|
OLESTATUS APIENTRY DocGetObject (LPOLESERVERDOC, OLE_LPCSTR, LPOLEOBJECT FAR *, LPOLECLIENT);
|
||
|
OLESTATUS APIENTRY DocRelease (LPOLESERVERDOC);
|
||
|
OLESTATUS APIENTRY DocSave (LPOLESERVERDOC);
|
||
|
OLESTATUS APIENTRY DocSetColorScheme (LPOLESERVERDOC, OLE_CONST LOGPALETTE FAR*);
|
||
|
OLESTATUS APIENTRY DocSetDocDimensions (LPOLESERVERDOC, OLE_CONST RECT FAR *);
|
||
|
OLESTATUS APIENTRY DocSetHostNames (LPOLESERVERDOC, OLE_LPCSTR, OLE_LPCSTR);
|
||
|
|
||
|
// Object methods
|
||
|
|
||
|
OLESTATUS APIENTRY ObjDoVerb (LPOLEOBJECT, UINT, BOOL, BOOL);
|
||
|
OLESTATUS APIENTRY ObjGetData (LPOLEOBJECT, OLECLIPFORMAT, LPHANDLE);
|
||
|
LPVOID APIENTRY ObjQueryProtocol (LPOLEOBJECT, OLE_LPCSTR);
|
||
|
OLESTATUS APIENTRY ObjRelease (LPOLEOBJECT);
|
||
|
OLESTATUS APIENTRY ObjSetBounds (LPOLEOBJECT, OLE_CONST RECT FAR*);
|
||
|
OLESTATUS APIENTRY ObjSetColorScheme (LPOLEOBJECT, OLE_CONST LOGPALETTE FAR*);
|
||
|
OLESTATUS APIENTRY ObjSetData (LPOLEOBJECT, OLECLIPFORMAT, HANDLE);
|
||
|
OLESTATUS APIENTRY ObjSetTargetDevice (LPOLEOBJECT, HANDLE);
|
||
|
OLESTATUS APIENTRY ObjShow (LPOLEOBJECT, BOOL);
|
||
|
OLECLIPFORMAT APIENTRY ObjEnumFormats (LPOLEOBJECT, OLECLIPFORMAT);
|
||
|
|