This fixes an annoying Internet Explorer optimization which would make the activex control invisible till a user moves the mouse over it
using namespace std;
-#define THREADING_MODEL "Both"
#define COMPANY_STR "VideoLAN"
#define PROGRAM_STR "VLCPlugin"
#define VERSION_MAJOR_STR "1"
#define VERSION_MINOR_STR "0"
#define DESCRIPTION "VideoLAN VLC ActiveX Plugin"
+#define THREADING_MODEL "Apartment"
+#define MISC_STATUS "131473"
+
#define PROGID_STR COMPANY_STR"."PROGRAM_STR
#define VERS_PROGID_STR COMPANY_STR"."PROGRAM_STR"."VERSION_MAJOR_STR
#define VERSION_STR VERSION_MAJOR_STR"."VERSION_MINOR_STR
// MiscStatus key value
hSubKey = keyCreate(hClassKey, TEXT("MiscStatus\\1"));
- RegSetValueEx(hSubKey, NULL, 0, REG_SZ, (const BYTE*)"131473", sizeof("131473"));
+ RegSetValueEx(hSubKey, NULL, 0, REG_SZ, (const BYTE*)MISC_STATUS, sizeof(MISC_STATUS));
RegCloseKey(hSubKey);
// Programmable key value
case OLEIVERB_SHOW:
case OLEIVERB_OPEN:
case OLEIVERB_INPLACEACTIVATE:
- if( NULL == hwndParent )
- return OLEOBJ_S_INVALIDHWND;
-
- if( SUCCEEDED(doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect)) )
- return S_OK;
-
- return OLEOBJ_S_CANNOT_DOVERB_NOW;
+ return doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect);
case OLEIVERB_HIDE:
_p_instance->setVisible(FALSE);
return S_OK;
default:
- if( NULL == hwndParent )
- return OLEOBJ_S_INVALIDHWND;
-
- if( SUCCEEDED(doInPlaceActivate(lpMsg, pActiveSite, hwndParent, lprcPosRect)) )
- return OLEOBJ_S_INVALIDVERB;
-
- return OLEOBJ_S_CANNOT_DOVERB_NOW;
+ return OLEOBJ_S_INVALIDVERB;
}
};
if( SUCCEEDED(pActiveSite->QueryInterface(IID_IOleInPlaceSite, (void**)&p_inPlaceSite)) )
{
if( S_OK != p_inPlaceSite->CanInPlaceActivate() )
- return E_FAIL;
+ return OLEOBJ_S_CANNOT_DOVERB_NOW;
LPOLEINPLACEFRAME p_inPlaceFrame;
LPOLEINPLACEUIWINDOW p_inPlaceUIWindow;
if( NULL != p_inPlaceUIWindow )
p_inPlaceUIWindow->Release();
}
+
+ if( (NULL == hwndParent) && FAILED(p_inPlaceSite->GetWindow(&hwndParent)) )
+ {
+ p_inPlaceSite->Release();
+ return OLEOBJ_S_INVALIDHWND;
+ }
}
+ else if( NULL == hwndParent )
+ return OLEOBJ_S_INVALIDHWND;
if( FAILED(_p_instance->onActivateInPlace(lpMsg, hwndParent, lprcPosRect, lprcClipRect)) )
- return E_FAIL;
+ {
+ if( NULL != p_inPlaceSite )
+ p_inPlaceSite->Release();
+ return OLEOBJ_S_CANNOT_DOVERB_NOW;
+ }
if( NULL != p_inPlaceSite )
p_inPlaceSite->OnPosRectChange(lprcPosRect);
}
return S_OK;
}
- return E_FAIL;
+ return OLEOBJ_S_CANNOT_DOVERB_NOW;
};
HRESULT VLCOleObject::doUIActivate(LPMSG lpMsg, LPOLECLIENTSITE pActiveSite, HWND hwndParent, LPCRECT lprcPosRect)
if( NULL != _p_clientsite )
_p_clientsite->AddRef();
- *ppClientSite= _p_clientsite;
+ *ppClientSite = _p_clientsite;
return S_OK;
};
VariantClear(&v);
}
}
-
_p_clientsite = pClientSite;
+ _p_instance->onClientSiteChanged(pClientSite);
return S_OK;
};
#include "persistpropbag.h"
#include "utils.h"
+#include "oleobject.h"
using namespace std;
STDMETHODIMP VLCPersistPropertyBag::InitNew(void)
{
- return _p_instance->onInitNew();
+ return _p_instance->onInit(TRUE);
};
STDMETHODIMP VLCPersistPropertyBag::Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog)
if( NULL == pPropBag )
return E_POINTER;
- HRESULT hr = _p_instance->onInitNew();
+ HRESULT hr = _p_instance->onInit(FALSE);
if( FAILED(hr) )
return hr;
VariantClear(&value);
}
- return S_OK;
+ return _p_instance->onLoad();
};
STDMETHODIMP VLCPersistPropertyBag::Save(LPPROPERTYBAG pPropBag, BOOL fClearDiry, BOOL fSaveAllProperties)
if( NULL == pStg )
return E_POINTER;
- return _p_instance->onInitNew();
+ return _p_instance->onInit(TRUE);
};
STDMETHODIMP VLCPersistStorage::Load(IStorage *pStg)
if( NULL == pStg )
return E_POINTER;
- return _p_instance->onInitNew();
+ return _p_instance->onInit(TRUE);
};
STDMETHODIMP VLCPersistStorage::Save(IStorage *pStg, BOOL fSameAsLoad)
STDMETHODIMP VLCPersistStreamInit::InitNew(void)
{
- return _p_instance->onInitNew();
+ return _p_instance->onInit(TRUE);
};
STDMETHODIMP VLCPersistStreamInit::Load(LPSTREAM pStm)
if( NULL == pStm )
return E_POINTER;
- return _p_instance->onInitNew();
+ return _p_instance->onInit(TRUE);
};
STDMETHODIMP VLCPersistStreamInit::Save(LPSTREAM pStm, BOOL fClearDirty)
}
};
-HRESULT VLCPlugin::onInitNew(void)
+#include <iostream>
+
+HRESULT VLCPlugin::onInit(BOOL isNew)
{
if( 0 == _i_vlc )
{
_i_vlc = 0;
return E_FAIL;
}
+
+ if( isNew )
+ {
+ /*
+ ** object has fully initialized,
+ ** try to activate in place if container is ready
+ */
+ LPOLECLIENTSITE pActiveSite;
+
+ if( SUCCEEDED(vlcOleObject->GetClientSite(&pActiveSite)) && (NULL != pActiveSite) )
+ {
+ vlcOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, pActiveSite, 0, NULL, NULL);
+ pActiveSite->Release();
+ }
+ }
return S_OK;
}
return E_UNEXPECTED;
};
-
+
+HRESULT VLCPlugin::onLoad(void)
+{
+ /*
+ ** object has fully initialized,
+ ** try to activate in place if container is ready
+ */
+ LPOLECLIENTSITE pActiveSite;
+
+ if( SUCCEEDED(vlcOleObject->GetClientSite(&pActiveSite)) && (NULL != pActiveSite) )
+ {
+ vlcOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, pActiveSite, 0, NULL, NULL);
+ pActiveSite->Release();
+ }
+ return S_OK;
+};
+
+HRESULT VLCPlugin::onClientSiteChanged(LPOLECLIENTSITE pActiveSite)
+{
+ if( NULL != pActiveSite )
+ {
+ /*
+ ** object is embedded in container
+ ** try to activate in place if it has initialized
+ */
+ if( _i_vlc )
+ {
+ vlcOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, pActiveSite, 0, NULL, NULL);
+ }
+ }
+ return S_OK;
+};
+
HRESULT VLCPlugin::onClose(DWORD dwSaveOption)
{
if( _i_vlc )
REFCLSID getClassID(void) { return (REFCLSID)CLSID_VLCPlugin; };
REFIID getDispEventID(void) { return (REFIID)DIID_DVLCEvents; };
- HRESULT onInitNew(void);
+ HRESULT onInit(BOOL isNew);
+ HRESULT onLoad(void);
+ HRESULT onClientSiteChanged(LPOLECLIENTSITE pActiveSite);
HRESULT onClose(DWORD dwSaveOption);
BOOL isInPlaceActive(void);