#ifndef _EDATAOBJ_H_
#define _EDATAOBJ_H_

#include "dataobj.h"


//EDATAOBJ.CPP
LRESULT WINAPI DataObjectWndProc(HWND, UINT, WPARAM, LPARAM);


class CAppVars
{
    friend LRESULT WINAPI DataObjectWndProc(HWND, UINT, WPARAM, LPARAM);

protected:
    HINSTANCE       m_hInst;            //WinMain parameters
    HINSTANCE       m_hInstPrev;
    LPSTR           m_pszCmdLine;
    UINT            m_nCmdShow;

    HWND            m_hWnd;             //Main window handle
    BOOL            m_fInitialized;     //Did CoInitialize work?

    //We have multiple classes, one for each data size.
    // DWORD           m_rgdwRegCO[DOSIZE_CSIZES];
    // LPCLASSFACTORY  m_rgpIClassFactory[DOSIZE_CSIZES];
    DWORD           m_dwRegCO;
    LPCLASSFACTORY  m_pIClassFactory;

public:
    CAppVars(HINSTANCE, HINSTANCE, LPSTR, UINT);
    ~CAppVars(void);
    BOOL FInit(void);
};

typedef CAppVars *PAPPVARS;

void PASCAL ObjectDestroyed(void);

//This class factory object creates Data Objects.

class CDataObjectClassFactory : public IClassFactory
{
protected:
    ULONG           m_cRef;

public:
    CDataObjectClassFactory();
    ~CDataObjectClassFactory(void);

    //IUnknown members
    STDMETHODIMP         QueryInterface(REFIID, PPVOID);
    STDMETHODIMP_(ULONG) AddRef(void);
    STDMETHODIMP_(ULONG) Release(void);

    //IClassFactory members
    STDMETHODIMP         CreateInstance(LPUNKNOWN, REFIID, PPVOID);
    STDMETHODIMP         LockServer(BOOL);
};

typedef CDataObjectClassFactory *PCDataObjectClassFactory;

#endif //_EDATAOBJ_H_