FORM.H
// --form.h------------------------------------------------------------------- 
// 
//  Declaration for the FRMFAC and FRM classes 
// 
//Copyright (C) 1986-1996. Microsoft Corporation.  All Rights Reserved. 
// 
// --------------------------------------------------------------------------- 
 
#ifndef _FORM_H 
#define_FORM_H 
 
#include <mapiform.h> 
#define INITGUID 
#include <initguid.h> 
#include <mapix.h> 
#include <mapiutil.h> 
#include <mapinls.h> 
 
#definekszFormsMessageName"IPM.ToolForm1" 
#definekszAppName"Tool Form Sample" 
#definekszAppLoadingTitle"Tool Form, Loading..." 
 
 
HRESULT HrStartOleAndRegisterClassFactory(void); 
HRESULT HrStopForms(void); 
 
#define NOTPURE 
#define MAX_ADVISE 48 
 
#define CbNewFlagList(_cflag) \ 
(offsetof(FlagList,ulFlag) + (_cflag)*sizeof(ULONG)) 
 
/* 
 *  Types 
 */ 
 
// ----- class factory 
class FRMFAC : public IClassFactory 
{ 
public: 
    FRMFAC(); 
 
    // *** IUnknown methods 
    STDMETHOD(QueryInterface)   (THIS_ REFIID riid, LPVOID FAR* ppvObj); 
    STDMETHOD_(ULONG,AddRef)    (THIS); 
    STDMETHOD_(ULONG,Release)   (THIS); 
 
    // *** IClassFactory methods 
    STDMETHOD(CreateInstance)   (THIS_ LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR* ppvObject); 
    STDMETHOD(LockServer)       (THIS_ BOOL fLock); 
protected: 
    ULONG       m_cRef; 
    CLSID       m_clsid; 
}; 
 
// ----- The minimal interface a form can support 
class FRM : public IPersistMessage, public IMAPIForm 
{ 
  protected: 
    ULONG                   m_cRef;               // Reference count 
    CLSID                   m_clsid; 
 
    BOOL                    m_fDirty;             // Is our message dirty? 
    BOOL                    m_fSentMessage;       // Are we reading a sent message? 
 
 
 
    // advise handling 
 
    BOOL                    m_afAdvisee[MAX_ADVISE]; 
    LPMAPIVIEWADVISESINK    m_aAdvisePtrs[MAX_ADVISE]; 
 
 
    // This is all the data that is specific to this exact form.  To change  
// the form, edit FormData.c and FormData.h which will be easier than  
// adding data here.  Also, FormData.h will give instructions on what  
// modifications are needed when data is added to a form. 
CFormDatam_theFormData; 
 
 
    ~FRM(void); 
 
  public: 
    LPMESSAGE               m_pMessage; 
    LPMAPIMESSAGESITE       m_pMessageSite; 
    LPMAPISESSION           m_pSession; 
 
    LPMAPIFORMMGR           m_pFormMgr; 
    LPMAPIFORMINFO          m_pFormInfo; 
 
    FRM(REFCLSID clsid); 
 
    MAPI_IUNKNOWN_METHODS(NOTPURE) 
    MAPI_GETLASTERROR_METHOD(NOTPURE) 
    MAPI_IPERSISTMESSAGE_METHODS(NOTPURE) 
    MAPI_IMAPIFORM_METHODS(NOTPURE) 
 
    HRESULT ShowCurrentMessage(ULONG ulhwndParent); 
    HRESULT LaunchReplyMessage(ULONG ulhwndParent); 
    VOID GetFormData(CFormData & theData); 
    VOID SetFormData(const CFormData & theData); 
    HRESULT Remember(LPMAPIMESSAGESITE pmsite, LPMESSAGE pmsg); 
    HRESULT Forget(VOID); 
    HRESULT SendForm(VOID); 
    HRESULT AddressForm(HWND hwnd, BOOL fDontShowIfRecipsExist); 
}; 
 
/* 
 *  Macros 
 */ 
 
#define ADVISE(_func)                    \ 
{                                        \ 
   for (LONG i = 0; i < MAX_ADVISE; i++) \ 
      if (m_afAdvisee[i])                \ 
         m_aAdvisePtrs[i]->_func();      \ 
} 
 
#define ReleaseObj(_pobj) \ 
        if (_pobj) \ 
                (_pobj)->Release() 
 
/* 
 *  Dependencies specific to this form 
 */ 
 
#define PR_FORMDATAPROP_TAG( PT_BINARY,   0x6800) 
 
typedef HRESULT (FAR PASCAL *LPFNCOREGISTERCLASSOBJECT)( 
            REFCLSID rclsid, 
            IUnknown FAR * pUnk, 
            DWORD dwClsContext, 
            DWORD flags, 
            LPDWORD lpdwRegister); 
#ifdef WIN16 
typedef BOOL (FAR PASCAL *LPFNISEQUALGUID)(REFGUID rguid1, REFGUID rguid2); 
#undef IsEqualIID 
#define IsEqualIID(riid1, riid2) (*lpfnIsEqualGUID)(riid1, riid2) 
#endif 
 
typedef HRESULT (FAR PASCAL *LPFNHRQUERYALLROWS)( 
            LPMAPITABLE ptable,  
            LPSPropTagArray ptaga, LPSRestriction pres, 
            LPSSortOrderSet psos, LONG crowsMax, 
            LPSRowSet FAR *pprows); 
typedef ULONG   (FAR PASCAL *LPFNMAPIFREEBUFFER)(LPVOID pv); 
typedef HRESULT (FAR PASCAL *LPFNMAPIINITIALIZE)(LPVOID lpvReserved); 
typedef void    (FAR PASCAL *LPFNMAPIUNINITIALIZE)(VOID); 
 
#ifdef WIN32 
#define szOleDll  "ole32.dll" 
#define szMapiDll "mapi32.dll" 
#else 
#define szOleDll  "compobj.dll" 
#define szMapiDll "mapi.dll" 
#endif 
 
#ifdef WIN16 
extern LPFNISEQUALGUID           lpfnIsEqualGUID; 
#endif 
extern LPFNCOREGISTERCLASSOBJECT lpfnCoRegisterClassObject; 
extern LPFNHRQUERYALLROWS        lpfnHrQueryAllRows       ; 
extern LPFNMAPIFREEBUFFER        lpfnMAPIFreeBuffer       ; 
extern LPFNMAPIINITIALIZE        lpfnMAPIInitialize       ; 
extern LPFNMAPIUNINITIALIZE      lpfnMAPIUninitialize     ; 
 
#endif