Added AX
This commit is contained in:
@@ -236,6 +236,10 @@
|
|||||||
RelativePath=".\AudioPlayer.cpp"
|
RelativePath=".\AudioPlayer.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\ax.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\ButtonListener.cpp"
|
RelativePath=".\ButtonListener.cpp"
|
||||||
>
|
>
|
||||||
@@ -317,6 +321,10 @@
|
|||||||
RelativePath=".\AudioPlayer.h"
|
RelativePath=".\AudioPlayer.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\ax.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\ButtonListener.h"
|
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 <exdisp.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <comdef.h>
|
||||||
|
#include <comdefsp.h>
|
||||||
|
#include "ax.h"
|
||||||
|
|
||||||
|
|
||||||
#if G3D_VER < 61000
|
#if G3D_VER < 61000
|
||||||
@@ -71,8 +73,6 @@ static const std::string PlaceholderName = "Dynamica";
|
|||||||
|
|
||||||
Demo *usableApp = NULL;
|
Demo *usableApp = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Demo::Demo(const GAppSettings& settings,HWND parentWindow) { //: GApp(settings,window) {
|
Demo::Demo(const GAppSettings& settings,HWND parentWindow) { //: GApp(settings,window) {
|
||||||
_hWndMain = parentWindow;
|
_hWndMain = parentWindow;
|
||||||
|
|
||||||
@@ -1559,6 +1559,9 @@ void Demo::onCreate(HWND parentWindow)
|
|||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
try{
|
try{
|
||||||
|
OleInitialize(0);
|
||||||
|
if (!AXRegister())
|
||||||
|
return 0;
|
||||||
tempPath = ((std::string)getenv("temp")) + "/"+PlaceholderName;
|
tempPath = ((std::string)getenv("temp")) + "/"+PlaceholderName;
|
||||||
CreateDirectory(tempPath.c_str(), NULL);
|
CreateDirectory(tempPath.c_str(), NULL);
|
||||||
|
|
||||||
@@ -1571,7 +1574,6 @@ int main(int argc, char** argv) {
|
|||||||
settings.logFilename = tempPath + "/g3dlog.txt";
|
settings.logFilename = tempPath + "/g3dlog.txt";
|
||||||
settings.window.center = true;
|
settings.window.center = true;
|
||||||
HMODULE hThisInstance = GetModuleHandle(NULL);
|
HMODULE hThisInstance = GetModuleHandle(NULL);
|
||||||
|
|
||||||
if (!createWindowClass("mainHWND",WndProc,hThisInstance))
|
if (!createWindowClass("mainHWND",WndProc,hThisInstance))
|
||||||
return false;
|
return false;
|
||||||
if (!createWindowClass("toolboxHWND",ToolboxProc,hThisInstance))
|
if (!createWindowClass("toolboxHWND",ToolboxProc,hThisInstance))
|
||||||
|
|||||||
Reference in New Issue
Block a user