Added AX
This commit is contained in:
@@ -236,6 +236,10 @@
|
||||
RelativePath=".\AudioPlayer.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ax.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ButtonListener.cpp"
|
||||
>
|
||||
@@ -317,6 +321,10 @@
|
||||
RelativePath=".\AudioPlayer.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ax.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ButtonListener.h"
|
||||
>
|
||||
|
||||
639
ax.cpp
Normal file
639
ax.cpp
Normal file
@@ -0,0 +1,639 @@
|
||||
// AX.CPP
|
||||
#include <windows.h>
|
||||
#include <comdef.h>
|
||||
#include <exdisp.h>
|
||||
#include <oledlg.h>
|
||||
#include "ax.h"
|
||||
|
||||
|
||||
#pragma warning (disable: 4311)
|
||||
#pragma warning (disable: 4312)
|
||||
#pragma warning (disable: 4244)
|
||||
#pragma warning (disable: 4800)
|
||||
|
||||
|
||||
// AXClientSite class
|
||||
// ------- Implement member functions
|
||||
AXClientSite :: AXClientSite()
|
||||
{
|
||||
refNum = 0;
|
||||
CalledCanInPlace = 0;
|
||||
InPlace = 0;
|
||||
}
|
||||
|
||||
AXClientSite :: ~AXClientSite()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
// IUnknown methods
|
||||
STDMETHODIMP AXClientSite :: QueryInterface(REFIID iid,void**ppvObject)
|
||||
{
|
||||
*ppvObject = 0;
|
||||
if (iid == IID_IOleClientSite)
|
||||
*ppvObject = (IOleClientSite*)this;
|
||||
if (iid == IID_IUnknown)
|
||||
*ppvObject = this;
|
||||
if (iid == IID_IAdviseSink)
|
||||
*ppvObject = (IAdviseSink*)this;
|
||||
if (iid == IID_IDispatch)
|
||||
*ppvObject = (IDispatch*)this;
|
||||
if (ExternalPlace == false)
|
||||
{
|
||||
if (iid == IID_IOleInPlaceSite)
|
||||
*ppvObject = (IOleInPlaceSite*)this;
|
||||
if (iid == IID_IOleInPlaceFrame)
|
||||
*ppvObject = (IOleInPlaceFrame*)this;
|
||||
if (iid == IID_IOleInPlaceUIWindow)
|
||||
*ppvObject = (IOleInPlaceUIWindow*)this;
|
||||
}
|
||||
|
||||
//* Log Call
|
||||
if (*ppvObject)
|
||||
{
|
||||
AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
STDMETHODIMP_(ULONG) AXClientSite :: AddRef()
|
||||
{
|
||||
refNum++;
|
||||
return refNum;
|
||||
}
|
||||
|
||||
STDMETHODIMP_(ULONG) AXClientSite :: Release()
|
||||
{
|
||||
refNum--;
|
||||
return refNum;
|
||||
}
|
||||
|
||||
|
||||
// IOleClientSite methods
|
||||
STDMETHODIMP AXClientSite :: SaveObject()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: GetMoniker(DWORD dwA,DWORD dwW,IMoniker**pm)
|
||||
{
|
||||
*pm = 0;
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: GetContainer(IOleContainer**pc)
|
||||
{
|
||||
*pc = 0;
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: ShowObject()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: OnShowWindow(BOOL f)
|
||||
{
|
||||
InvalidateRect(Window, 0, TRUE);
|
||||
InvalidateRect(Parent, 0, TRUE);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: RequestNewObjectLayout()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP_(void) AXClientSite :: OnViewChange(DWORD dwAspect,LONG lIndex)
|
||||
{
|
||||
}
|
||||
|
||||
STDMETHODIMP_(void) AXClientSite :: OnRename(IMoniker * pmk)
|
||||
{
|
||||
}
|
||||
|
||||
STDMETHODIMP_(void) AXClientSite :: OnSave()
|
||||
{
|
||||
}
|
||||
|
||||
STDMETHODIMP_(void) AXClientSite :: OnClose()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
// IOleInPlaceSite methods
|
||||
STDMETHODIMP AXClientSite :: GetWindow(HWND *p)
|
||||
{
|
||||
*p = Window;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: ContextSensitiveHelp(BOOL)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP AXClientSite :: CanInPlaceActivate()
|
||||
{
|
||||
if (InPlace)
|
||||
{
|
||||
CalledCanInPlace = true;
|
||||
return S_OK;
|
||||
}
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: OnInPlaceActivate()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: OnUIActivate()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: GetWindowContext(IOleInPlaceFrame** ppFrame,IOleInPlaceUIWindow **ppDoc,LPRECT r1,LPRECT r2,LPOLEINPLACEFRAMEINFO o)
|
||||
{
|
||||
*ppFrame = (IOleInPlaceFrame*)this;
|
||||
AddRef();
|
||||
|
||||
*ppDoc = NULL;
|
||||
GetClientRect(Window,r1);
|
||||
GetClientRect(Window,r2);
|
||||
o->cb = sizeof(OLEINPLACEFRAMEINFO);
|
||||
o->fMDIApp = false;
|
||||
o->hwndFrame = Parent;
|
||||
o->haccel = 0;
|
||||
o->cAccelEntries = 0;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: Scroll(SIZE s)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: OnUIDeactivate(int)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: OnInPlaceDeactivate()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: DiscardUndoState()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: DeactivateAndUndo()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: OnPosRectChange(LPCRECT)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
// IOleInPlaceFrame methods
|
||||
STDMETHODIMP AXClientSite :: GetBorder(LPRECT l)
|
||||
{
|
||||
GetClientRect(Window,l);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: RequestBorderSpace(LPCBORDERWIDTHS b)
|
||||
{
|
||||
//return S_OK;
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: SetBorderSpace(LPCBORDERWIDTHS b)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: SetActiveObject(IOleInPlaceActiveObject*pV,LPCOLESTR s)
|
||||
{
|
||||
ax->Pao = pV;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP AXClientSite :: SetStatusText(LPCOLESTR t)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: EnableModeless(BOOL f)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: TranslateAccelerator(LPMSG,WORD)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
// IDispatch Methods
|
||||
HRESULT _stdcall AXClientSite :: GetTypeInfoCount(
|
||||
unsigned int * pctinfo) {return E_NOTIMPL;}
|
||||
|
||||
HRESULT _stdcall AXClientSite :: GetTypeInfo(
|
||||
unsigned int iTInfo,
|
||||
LCID lcid,
|
||||
ITypeInfo FAR* FAR* ppTInfo) {return E_NOTIMPL;}
|
||||
|
||||
HRESULT _stdcall AXClientSite :: GetIDsOfNames(
|
||||
REFIID riid,
|
||||
OLECHAR FAR* FAR*,
|
||||
unsigned int cNames,
|
||||
LCID lcid,
|
||||
DISPID FAR* ) {return E_NOTIMPL;}
|
||||
|
||||
|
||||
// Other Methods
|
||||
void AX :: Init(char* cls)
|
||||
{
|
||||
wchar_t x[1000] = {0};
|
||||
MultiByteToWideChar(CP_ACP,0,cls,-1,x,1000);
|
||||
CLSIDFromString(x,&clsid);
|
||||
iid = (IID*)&IID_IOleObject;
|
||||
OleObject = 0;
|
||||
Storage = 0;
|
||||
View = 0;
|
||||
Data = 0;
|
||||
Unk = 0;
|
||||
Pao = 0;
|
||||
AdviseToken = 0;
|
||||
memset(DAdviseToken,0,sizeof(DAdviseToken));
|
||||
Site.ax = this;
|
||||
}
|
||||
|
||||
AX :: AX(char* cls)
|
||||
{
|
||||
Init(cls);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AX :: Clean()
|
||||
{
|
||||
if (Site.InPlace == true)
|
||||
{
|
||||
Site.InPlace = false;
|
||||
IOleInPlaceObject* iib = 0;
|
||||
if (OleObject)
|
||||
OleObject->QueryInterface(IID_IOleInPlaceObject,(void**)&iib);
|
||||
if (iib)
|
||||
{
|
||||
iib->UIDeactivate();
|
||||
iib->InPlaceDeactivate();
|
||||
iib->Release();
|
||||
}
|
||||
}
|
||||
|
||||
if (AdviseToken && OleObject)
|
||||
{
|
||||
OleObject->Unadvise(AdviseToken);
|
||||
AdviseToken = 0;
|
||||
}
|
||||
if (Data)
|
||||
{
|
||||
for(int i = 0 ; i < 100 ; i++)
|
||||
if (DAdviseToken[i])
|
||||
Data->DUnadvise(DAdviseToken[i]);
|
||||
memset(DAdviseToken,0,sizeof(DAdviseToken));
|
||||
}
|
||||
|
||||
|
||||
if (Pao) Pao->Release();
|
||||
if (Unk) Unk->Release();
|
||||
if (Data) Data->Release();
|
||||
if (View) View->Release();
|
||||
if (Storage) Storage->Release();
|
||||
if (OleObject) OleObject->Release();
|
||||
Unk = 0;
|
||||
Data = 0;
|
||||
View = 0;
|
||||
Storage = 0;
|
||||
OleObject = 0;
|
||||
|
||||
}
|
||||
|
||||
AX :: ~AX()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
CLSID AX :: GetCLSID()
|
||||
{
|
||||
return clsid;
|
||||
}
|
||||
|
||||
HRESULT _stdcall AXClientSite :: InsertMenus(HMENU h,LPOLEMENUGROUPWIDTHS x)
|
||||
{
|
||||
/* AX * t = (AX*)ax;
|
||||
if (t->AddMenu)
|
||||
{
|
||||
x->width[0] = 0;
|
||||
x->width[2] = 0;
|
||||
x->width[4] = 0;
|
||||
//InsertMenu(h,0,MF_BYPOSITION | MF_POPUP,(int)Menu,"test");
|
||||
return S_OK;
|
||||
}
|
||||
*/
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
HRESULT _stdcall AXClientSite :: SetMenu(HMENU h,HOLEMENU hO,HWND hw)
|
||||
{
|
||||
AX * t = (AX*)ax;
|
||||
/* if (t->AddMenu)
|
||||
{
|
||||
if (!h && !hO)
|
||||
{
|
||||
//::SetMenu(Window,Menu);
|
||||
//DrawMenuBar(Window);
|
||||
::SetMenu(Parent,Menu);
|
||||
DrawMenuBar(Parent);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
//::SetMenu(Window,h);
|
||||
//DrawMenuBar(Window);
|
||||
|
||||
//HMENU hm = GetMenu(Parent);
|
||||
//AppendMenu(hm,MF_POPUP | MF_MENUBREAK,(int)h,0);
|
||||
//::SetMenu(Parent,hm);
|
||||
::SetMenu(Parent,h);
|
||||
DrawMenuBar(Parent);
|
||||
|
||||
//hOleWindow = hw;
|
||||
//OleSetMenuDescriptor(hO,Window,hw,0,0);
|
||||
OleSetMenuDescriptor(hO,Parent,hw,0,0);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
*/
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
HRESULT _stdcall AXClientSite :: RemoveMenus(HMENU h)
|
||||
{
|
||||
AX * t = (AX*)ax;
|
||||
if (t->AddMenu)
|
||||
{
|
||||
if (!h)
|
||||
return S_OK;
|
||||
|
||||
int c = GetMenuItemCount(h);
|
||||
for (int i = c ; i >= 0 ; i--)
|
||||
{
|
||||
HMENU hh = GetSubMenu(h,i);
|
||||
if (hh == Menu)
|
||||
RemoveMenu(h,i,MF_BYPOSITION);
|
||||
}
|
||||
if (h == Menu)
|
||||
DestroyMenu(h);
|
||||
|
||||
//DrawMenuBar(Window);
|
||||
DrawMenuBar(Parent);
|
||||
return S_OK;
|
||||
}
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
HRESULT _stdcall AXClientSite :: Invoke(
|
||||
DISPID dispIdMember,
|
||||
REFIID riid,
|
||||
LCID lcid,
|
||||
WORD wFlags,
|
||||
DISPPARAMS FAR* pDispParams,
|
||||
VARIANT FAR* pVarResult,
|
||||
EXCEPINFO FAR* pExcepInfo,
|
||||
unsigned int FAR* puArgErr)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
void _stdcall AXClientSite :: OnDataChange(FORMATETC *pFormatEtc,STGMEDIUM *pStgmed)
|
||||
{
|
||||
// Notify our app that a change is being requested
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Window Procedure for AX control
|
||||
LRESULT CALLBACK AXWndProc(HWND hh,UINT mm,WPARAM ww,LPARAM ll)
|
||||
{
|
||||
if (mm == WM_CREATE)
|
||||
{
|
||||
char tit[1000] = {0};
|
||||
HRESULT hr;
|
||||
|
||||
GetWindowTextA(hh,tit,1000);
|
||||
|
||||
AX* ax;
|
||||
ax = new AX(tit);
|
||||
|
||||
SetWindowLong(hh,GWL_USERDATA,(LONG)ax);
|
||||
ax->Site.Window = hh;
|
||||
ax->Site.Parent = GetParent(hh);
|
||||
|
||||
hr = StgCreateDocfile(0,STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_DIRECT | STGM_CREATE,0,&ax->Storage);
|
||||
ax->Site.Window = hh;
|
||||
|
||||
REFIID rid = *ax->iid;
|
||||
hr = OleCreate(ax->GetCLSID(),rid,OLERENDER_DRAW,0,&ax->Site,ax->Storage,(void**)&ax->OleObject);
|
||||
|
||||
|
||||
|
||||
if (!ax->OleObject)
|
||||
{
|
||||
delete ax;
|
||||
SetWindowLong(hh,GWL_USERDATA,0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
hr = OleSetContainedObject(ax->OleObject, TRUE);
|
||||
hr = ax->OleObject->Advise(&ax->Site,&ax->AdviseToken);
|
||||
hr = ax->OleObject->QueryInterface(IID_IViewObject,(void**)&ax->View);
|
||||
hr = ax->OleObject->QueryInterface(IID_IDataObject,(void**)&ax->Data);
|
||||
if (ax->View)
|
||||
hr = ax->View->SetAdvise(DVASPECT_CONTENT,0,&ax->Site);
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (mm == WM_DESTROY)
|
||||
{
|
||||
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
|
||||
if (!ax)
|
||||
return 0;
|
||||
ax->Clean();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mm == AX_SETDATAADVISE)
|
||||
{
|
||||
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
|
||||
if (!ax)
|
||||
return 0;
|
||||
|
||||
// 1.Enum available FORMATETC structures
|
||||
// 2.Set Data Advise specified to index ww
|
||||
if (!ax->Data)
|
||||
return 0;
|
||||
|
||||
IEnumFORMATETC* ief = 0;
|
||||
int i = 0;
|
||||
|
||||
FORMATETC fe;
|
||||
ax->Data->EnumFormatEtc((LPARAM)ll,&ief);
|
||||
if (!ief)
|
||||
return 0;
|
||||
for(;;)
|
||||
{
|
||||
HRESULT hr = ief->Next(1,&fe,0);
|
||||
if (hr != S_OK)
|
||||
break;
|
||||
if (ww == i)
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
ief->Release();
|
||||
if (ww == -1)
|
||||
return i;
|
||||
|
||||
if (ax->Data)
|
||||
ax->Data->DAdvise(&fe,0,&ax->Site,&ax->DAdviseToken[ww]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mm == AX_GETAXINTERFACE)
|
||||
{
|
||||
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
|
||||
return (LONG)ax;
|
||||
}
|
||||
|
||||
if (mm == AX_QUERYINTERFACE)
|
||||
{
|
||||
char* p = (char*)ww;
|
||||
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
|
||||
if (!ax)
|
||||
return 0;
|
||||
return ax->OleObject->QueryInterface((REFIID)*p,(void**)ll);
|
||||
}
|
||||
|
||||
if (mm == WM_LBUTTONDBLCLK)
|
||||
{
|
||||
PostMessage(hh,AX_INPLACE,1,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if (mm == AX_INPLACE)
|
||||
{
|
||||
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
|
||||
if (!ax)
|
||||
return 0;
|
||||
if (!ax->OleObject)
|
||||
return 0;
|
||||
RECT rect;
|
||||
HRESULT hr;
|
||||
::GetClientRect(hh,&rect);
|
||||
|
||||
if (ax->Site.InPlace == false && ww == 1) // Activate In Place
|
||||
{
|
||||
ax->Site.InPlace = true;
|
||||
ax->Site.ExternalPlace = ll;
|
||||
hr = ax->OleObject->DoVerb(OLEIVERB_INPLACEACTIVATE,0,&ax->Site,0,hh,&rect);
|
||||
InvalidateRect(hh,0,true);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ax->Site.InPlace == true && ww == 0) // Deactivate
|
||||
{
|
||||
ax->Site.InPlace = false;
|
||||
|
||||
IOleInPlaceObject* iib;
|
||||
ax->OleObject->QueryInterface(IID_IOleInPlaceObject,(void**)&iib);
|
||||
if (iib)
|
||||
{
|
||||
iib->UIDeactivate();
|
||||
iib->InPlaceDeactivate();
|
||||
iib->Release();
|
||||
InvalidateRect(hh,0,true);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (mm == WM_SIZE)
|
||||
{
|
||||
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
|
||||
if (!ax)
|
||||
return 0;
|
||||
if (!ax->OleObject)
|
||||
return 0;
|
||||
|
||||
DefWindowProc(hh,mm,ww,ll);
|
||||
|
||||
if (ax->Site.InPlace == true)
|
||||
{
|
||||
SendMessage(hh,AX_INPLACE,0,0);
|
||||
InvalidateRect(hh,0,true);
|
||||
SendMessage(hh,AX_INPLACE,1,0);
|
||||
}
|
||||
|
||||
IOleInPlaceObject* pl;
|
||||
ax->OleObject->QueryInterface(IID_IOleInPlaceObject,(void**)&pl);
|
||||
if (!pl)
|
||||
return 0;
|
||||
RECT r;
|
||||
GetClientRect(ax->Site.Window,&r);
|
||||
pl->SetObjectRects(&r,&r);
|
||||
pl->Release();
|
||||
return 0;
|
||||
}
|
||||
|
||||
return DefWindowProc(hh,mm,ww,ll);
|
||||
}
|
||||
|
||||
// Registration function
|
||||
ATOM AXRegister()
|
||||
{
|
||||
WNDCLASSEXA wC = {0};
|
||||
|
||||
wC.cbSize = sizeof(wC);
|
||||
wC.style = CS_GLOBALCLASS | CS_DBLCLKS;
|
||||
wC.lpfnWndProc = AXWndProc;
|
||||
wC.cbWndExtra = 4;
|
||||
wC.hInstance = GetModuleHandle(0);
|
||||
wC.lpszClassName = "AX";
|
||||
return RegisterClassExA(&wC);
|
||||
}
|
||||
|
||||
142
ax.h
Normal file
142
ax.h
Normal file
@@ -0,0 +1,142 @@
|
||||
// AX.H
|
||||
|
||||
// messages
|
||||
#define AX_QUERYINTERFACE (WM_USER + 1)
|
||||
#define AX_INPLACE (WM_USER + 2)
|
||||
#define AX_GETAXINTERFACE (WM_USER + 3)
|
||||
#define AX_CONNECTOBJECT (WM_USER + 4)
|
||||
#define AX_DISCONNECTOBJECT (WM_USER + 5)
|
||||
#define AX_SETDATAADVISE (WM_USER + 6)
|
||||
#define AX_DOVERB (WM_USER + 7)
|
||||
|
||||
|
||||
// Registration function
|
||||
ATOM AXRegister();
|
||||
|
||||
|
||||
// Class AXClientSide
|
||||
class AXClientSite :
|
||||
public IOleClientSite,
|
||||
public IDispatch,
|
||||
public IAdviseSink,
|
||||
public IOleInPlaceSite,
|
||||
public IOleInPlaceFrame
|
||||
{
|
||||
protected:
|
||||
|
||||
int refNum;
|
||||
|
||||
public:
|
||||
|
||||
|
||||
HWND Window;
|
||||
HWND Parent;
|
||||
HMENU Menu;
|
||||
bool InPlace;
|
||||
bool ExternalPlace;
|
||||
bool CalledCanInPlace;
|
||||
|
||||
class AX* ax;
|
||||
|
||||
// MyClientSite Methods
|
||||
AXClientSite();
|
||||
virtual ~AXClientSite();
|
||||
STDMETHODIMP_(void) OnDataChange2(FORMATETC*);
|
||||
|
||||
// IUnknown methods
|
||||
STDMETHODIMP QueryInterface(REFIID iid,void**ppvObject);
|
||||
STDMETHODIMP_(ULONG) AddRef();
|
||||
STDMETHODIMP_(ULONG) Release();
|
||||
|
||||
// IOleClientSite methods
|
||||
STDMETHODIMP SaveObject();
|
||||
STDMETHODIMP GetMoniker(DWORD dwA,DWORD dwW,IMoniker**pm);
|
||||
STDMETHODIMP GetContainer(IOleContainer**pc);
|
||||
STDMETHODIMP ShowObject();
|
||||
STDMETHODIMP OnShowWindow(BOOL f);
|
||||
STDMETHODIMP RequestNewObjectLayout();
|
||||
|
||||
// IAdviseSink methods
|
||||
STDMETHODIMP_(void) OnDataChange(FORMATETC *pFormatEtc,STGMEDIUM *pStgmed);
|
||||
|
||||
STDMETHODIMP_(void) OnViewChange(DWORD dwAspect,LONG lIndex);
|
||||
STDMETHODIMP_(void) OnRename(IMoniker * pmk);
|
||||
STDMETHODIMP_(void) OnSave();
|
||||
STDMETHODIMP_(void) OnClose();
|
||||
|
||||
// IOleInPlaceSite methods
|
||||
STDMETHODIMP GetWindow(HWND *p);
|
||||
STDMETHODIMP ContextSensitiveHelp(BOOL);
|
||||
STDMETHODIMP CanInPlaceActivate();
|
||||
STDMETHODIMP OnInPlaceActivate();
|
||||
STDMETHODIMP OnUIActivate();
|
||||
STDMETHODIMP GetWindowContext(IOleInPlaceFrame** ppFrame,IOleInPlaceUIWindow **ppDoc,LPRECT r1,LPRECT r2,LPOLEINPLACEFRAMEINFO o);
|
||||
STDMETHODIMP Scroll(SIZE s);
|
||||
STDMETHODIMP OnUIDeactivate(int);
|
||||
STDMETHODIMP OnInPlaceDeactivate();
|
||||
STDMETHODIMP DiscardUndoState();
|
||||
STDMETHODIMP DeactivateAndUndo();
|
||||
STDMETHODIMP OnPosRectChange(LPCRECT);
|
||||
|
||||
// IOleInPlaceFrame methods
|
||||
STDMETHODIMP GetBorder(LPRECT l);
|
||||
STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS);
|
||||
STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS w);
|
||||
STDMETHODIMP SetActiveObject(IOleInPlaceActiveObject*pV,LPCOLESTR s);
|
||||
STDMETHODIMP InsertMenus(HMENU h,LPOLEMENUGROUPWIDTHS x);
|
||||
STDMETHODIMP SetMenu(HMENU h,HOLEMENU hO,HWND hw);
|
||||
STDMETHODIMP RemoveMenus(HMENU h);
|
||||
STDMETHODIMP SetStatusText(LPCOLESTR t);
|
||||
STDMETHODIMP EnableModeless(BOOL f);
|
||||
STDMETHODIMP TranslateAccelerator(LPMSG,WORD);
|
||||
|
||||
|
||||
// IDispatch Methods
|
||||
HRESULT _stdcall GetTypeInfoCount(unsigned int * pctinfo);
|
||||
HRESULT _stdcall GetTypeInfo(unsigned int iTInfo,LCID lcid,ITypeInfo FAR* FAR* ppTInfo);
|
||||
HRESULT _stdcall GetIDsOfNames(REFIID riid,OLECHAR FAR* FAR*,unsigned int cNames,LCID lcid,DISPID FAR* );
|
||||
HRESULT _stdcall Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS FAR* pDispParams,VARIANT FAR* pVarResult,EXCEPINFO FAR* pExcepInfo,unsigned int FAR* puArgErr);
|
||||
|
||||
// IOleControlSite Methods
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
// Class AX
|
||||
class AX
|
||||
{
|
||||
public:
|
||||
|
||||
AX(char* clsid);
|
||||
CLSID GetCLSID();
|
||||
~AX();
|
||||
|
||||
|
||||
void Init(char* clsid);
|
||||
void Clean();
|
||||
|
||||
AXClientSite Site;
|
||||
IID* iid;
|
||||
IOleObject* OleObject;
|
||||
IStorage* Storage;
|
||||
IViewObject* View;
|
||||
IDataObject* Data;
|
||||
IUnknown* Unk;
|
||||
IOleInPlaceActiveObject* Pao;
|
||||
//AX_CONNECTSTRUCT* tcs;
|
||||
bool AddMenu;
|
||||
DWORD AdviseToken;
|
||||
DWORD DAdviseToken[100];
|
||||
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
CLSID clsid;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
10
main.cpp
10
main.cpp
@@ -34,7 +34,9 @@
|
||||
#include <exdisp.h>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#include <comdef.h>
|
||||
#include <comdefsp.h>
|
||||
#include "ax.h"
|
||||
|
||||
|
||||
#if G3D_VER < 61000
|
||||
@@ -71,8 +73,6 @@ static const std::string PlaceholderName = "Dynamica";
|
||||
|
||||
Demo *usableApp = NULL;
|
||||
|
||||
|
||||
|
||||
Demo::Demo(const GAppSettings& settings,HWND parentWindow) { //: GApp(settings,window) {
|
||||
_hWndMain = parentWindow;
|
||||
|
||||
@@ -1559,6 +1559,9 @@ void Demo::onCreate(HWND parentWindow)
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
try{
|
||||
OleInitialize(0);
|
||||
if (!AXRegister())
|
||||
return 0;
|
||||
tempPath = ((std::string)getenv("temp")) + "/"+PlaceholderName;
|
||||
CreateDirectory(tempPath.c_str(), NULL);
|
||||
|
||||
@@ -1571,7 +1574,6 @@ int main(int argc, char** argv) {
|
||||
settings.logFilename = tempPath + "/g3dlog.txt";
|
||||
settings.window.center = true;
|
||||
HMODULE hThisInstance = GetModuleHandle(NULL);
|
||||
|
||||
if (!createWindowClass("mainHWND",WndProc,hThisInstance))
|
||||
return false;
|
||||
if (!createWindowClass("toolboxHWND",ToolboxProc,hThisInstance))
|
||||
|
||||
Reference in New Issue
Block a user