Home » Eclipse Projects » Standard Widget Toolkit (SWT) » Bug 72320: SWT Fails to load ActiveX control with error -2147467262
Bug 72320: SWT Fails to load ActiveX control with error -2147467262 [message #443367] |
Thu, 23 September 2004 15:56  |
Eclipse User |
|
|
|
Hi,
I just figured out that this is not a bug of the eclipse SWT. Actually it's
that control itself(DSOFramerControl which can be found on MSDN) dosen't
implement minimum required interfaces, in consequence it can't be
instantiated by win32 API OleCreate.
Older "OLE object" specifications require the implementation of IOleObject,
IDataObject and IPersistStorage as the mimimal set of interfaces to qualify
a blob as an OLE object. To workaround, you must implement the missing
interface as what I did, and it works fine.
Fan Yang
OSTnet Inc.
|
|
| | | |
Re: Bug 72320: SWT Fails to load ActiveX control with error -2147467262 [message #444054 is a reply to message #443553] |
Tue, 05 October 2004 18:39   |
Eclipse User |
|
|
|
Hi,
Sorry for late response because I'm working on another project and didn't
visit swt newsgroup for a while.
I have to say that I'm not a COM expert, so the solution maybe not perfect,
it's just for your reference. If you find errors or another good solution,
please let me know. thanks.
By the way, actually I rewrote the CDsoFramerControl(ActiveX control) by
using ATL and kept the CDsoDocObject(ActiveX document container), in that
way, I have integrate our system(COM based) with eclipse, and it works fine.
//Step 1. Add following code to dsoframer.h
// IPersistStorage
BEGIN_INTERFACE_PART(PersistStorage, IPersistStorage)
STDMETHODIMP GetClassID(CLSID *pClassID);
STDMETHODIMP IsDirty(void);
STDMETHODIMP Load(IStorage * pStg);
STDMETHODIMP Save(IStorage * pStgSave, BOOL fSameAsLoad);
STDMETHODIMP SaveCompleted(IStorage * pStgNew);
STDMETHODIMP HandsOffStorage(void);
STDMETHODIMP InitNew(IStorage* pStg);
END_INTERFACE_PART(PersistStorage)
//Step 2. add following code to dsofcontrol.cpp
//////////////////////////////////////////////////////////// ////////////
// CDsoFramerControl::XPersistStorage -- IPersistStorage Implementation
// STDMETHODIMP GetClassID(CLSID *pClassID);
// STDMETHODIMP IsDirty(void);
// STDMETHODIMP Load(IStorage * pStg);
// STDMETHODIMP Save(IStorage * pStgSave, BOOL fSameAsLoad);
// STDMETHODIMP SaveCompleted(IStorage * pStgNew);
// STDMETHODIMP HandsOffStorage(void);
// STDMETHODIMP InitNew(IStorage* pStg);
IMPLEMENT_INTERFACE_UNKNOWN(CDsoFramerControl, PersistStorage)
STDMETHODIMP CDsoFramerControl::XPersistStorage::GetClassID(CLSID *pClassID)
{
ODS("CDsoFramerControl::XPersistStorage::GetClassID\n");
if (pClassID) *pClassID = CLSID_FramerControl;
return S_OK;
}
STDMETHODIMP CDsoFramerControl::XPersistStorage::IsDirty(void)
{
METHOD_PROLOGUE(CDsoFramerControl, PersistStorage);
ODS("CDsoFramerControl::XPersistStorage::IsDirty\n");
return (pThis->m_fDirty) ? S_OK : S_FALSE;
}
STDMETHODIMP CDsoFramerControl::XPersistStorage::InitNew(IStorage* pStg)
{
METHOD_PROLOGUE(CDsoFramerControl, PersistStorage);
ODS("CDsoFramerControl::XPersistStorage::InitNew\n");
//return pThis->m_xPersistStreamInit.InitNew();
return S_OK;
}
STDMETHODIMP CDsoFramerControl::XPersistStorage::Save(IStorage * pStgSave,
BOOL fSameAsLoad)
{
METHOD_PROLOGUE(CDsoFramerControl, PersistStorage);
ODS("CDsoFramerControl::XPersistStorage::Save\n");
if (pStgSave == NULL)
return E_INVALIDARG;
HRESULT hr = E_FAIL;
LPSTREAM pIStream;
static LPCOLESTR vszContents = OLESTR("Contents");
hr = pStgSave->CreateStream(vszContents,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
0, 0, &pIStream);
if (SUCCEEDED(hr))
hr = pThis->m_xPersistStreamInit.Save(pIStream, fSameAsLoad);
pIStream->Release();
return hr;
}
STDMETHODIMP CDsoFramerControl::XPersistStorage::Load(IStorage * pStg)
{
METHOD_PROLOGUE(CDsoFramerControl, PersistStorage);
ODS("CDsoFramerControl::XPersistStorage::Load\n");
if (pStg == NULL)
return E_INVALIDARG;
HRESULT hr = E_FAIL;
LPSTREAM pIStream;
hr = pStg->OpenStream(OLESTR("Contents"), NULL,
STGM_DIRECT | STGM_SHARE_EXCLUSIVE, 0, &pIStream);
if (SUCCEEDED(hr))
hr = pThis->m_xPersistStreamInit.Load(pIStream);
pIStream->Release();
return hr;
}
STDMETHODIMP CDsoFramerControl::XPersistStorage::SaveCompleted(IStorage *
pStgNew)
{
METHOD_PROLOGUE(CDsoFramerControl, PersistStorage);
ODS("CDsoFramerControl::XPersistStorage::SaveCompleted\n");
return S_OK;
}
STDMETHODIMP CDsoFramerControl::XPersistStorage::HandsOffStorage(void)
{
METHOD_PROLOGUE(CDsoFramerControl, PersistStorage);
ODS("CDsoFramerControl::XPersistStorage::HandsOffStorage\n");
return S_OK;
}
//Step 3. modify XInternalUnknown::QueryInterface member function which
exists in dsofcontrol.cpp
// add following code before the line "else if (IID_IPersistPropertyBag ==
riid)"
else if (IID_IPersistStorage == riid)
{
*ppv = (IPersistStorage*)&(pThis->m_xPersistStorage);
}
|
|
|
Re: Bug 72320: SWT Fails to load ActiveX control with error -2147467262 [message #444147 is a reply to message #444054] |
Thu, 07 October 2004 14:32  |
Eclipse User |
|
|
|
Thanks for the code! Its really appreciated!
"fan" <fan@ostnet.com> wrote in message news:cjv72o$5ca$1@eclipse.org...
> Hi,
>
> Sorry for late response because I'm working on another project and didn't
> visit swt newsgroup for a while.
>
> I have to say that I'm not a COM expert, so the solution maybe not
perfect,
> it's just for your reference. If you find errors or another good solution,
> please let me know. thanks.
>
> By the way, actually I rewrote the CDsoFramerControl(ActiveX control) by
> using ATL and kept the CDsoDocObject(ActiveX document container), in that
> way, I have integrate our system(COM based) with eclipse, and it works
fine.
>
> //Step 1. Add following code to dsoframer.h
> // IPersistStorage
> BEGIN_INTERFACE_PART(PersistStorage, IPersistStorage)
> STDMETHODIMP GetClassID(CLSID *pClassID);
> STDMETHODIMP IsDirty(void);
> STDMETHODIMP Load(IStorage * pStg);
> STDMETHODIMP Save(IStorage * pStgSave, BOOL fSameAsLoad);
> STDMETHODIMP SaveCompleted(IStorage * pStgNew);
> STDMETHODIMP HandsOffStorage(void);
> STDMETHODIMP InitNew(IStorage* pStg);
> END_INTERFACE_PART(PersistStorage)
>
> //Step 2. add following code to dsofcontrol.cpp
> //////////////////////////////////////////////////////////// ////////////
> // CDsoFramerControl::XPersistStorage -- IPersistStorage Implementation
> // STDMETHODIMP GetClassID(CLSID *pClassID);
> // STDMETHODIMP IsDirty(void);
> // STDMETHODIMP Load(IStorage * pStg);
> // STDMETHODIMP Save(IStorage * pStgSave, BOOL fSameAsLoad);
> // STDMETHODIMP SaveCompleted(IStorage * pStgNew);
> // STDMETHODIMP HandsOffStorage(void);
> // STDMETHODIMP InitNew(IStorage* pStg);
> IMPLEMENT_INTERFACE_UNKNOWN(CDsoFramerControl, PersistStorage)
> STDMETHODIMP CDsoFramerControl::XPersistStorage::GetClassID(CLSID
*pClassID)
> {
> ODS("CDsoFramerControl::XPersistStorage::GetClassID\n");
> if (pClassID) *pClassID = CLSID_FramerControl;
> return S_OK;
> }
>
> STDMETHODIMP CDsoFramerControl::XPersistStorage::IsDirty(void)
> {
> METHOD_PROLOGUE(CDsoFramerControl, PersistStorage);
> ODS("CDsoFramerControl::XPersistStorage::IsDirty\n");
> return (pThis->m_fDirty) ? S_OK : S_FALSE;
> }
>
> STDMETHODIMP CDsoFramerControl::XPersistStorage::InitNew(IStorage* pStg)
> {
> METHOD_PROLOGUE(CDsoFramerControl, PersistStorage);
> ODS("CDsoFramerControl::XPersistStorage::InitNew\n");
> //return pThis->m_xPersistStreamInit.InitNew();
> return S_OK;
> }
>
> STDMETHODIMP CDsoFramerControl::XPersistStorage::Save(IStorage * pStgSave,
> BOOL fSameAsLoad)
> {
> METHOD_PROLOGUE(CDsoFramerControl, PersistStorage);
> ODS("CDsoFramerControl::XPersistStorage::Save\n");
> if (pStgSave == NULL)
> return E_INVALIDARG;
>
> HRESULT hr = E_FAIL;
> LPSTREAM pIStream;
> static LPCOLESTR vszContents = OLESTR("Contents");
> hr = pStgSave->CreateStream(vszContents,
> STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
> 0, 0, &pIStream);
> if (SUCCEEDED(hr))
> hr = pThis->m_xPersistStreamInit.Save(pIStream, fSameAsLoad);
>
> pIStream->Release();
> return hr;
> }
>
> STDMETHODIMP CDsoFramerControl::XPersistStorage::Load(IStorage * pStg)
> {
> METHOD_PROLOGUE(CDsoFramerControl, PersistStorage);
> ODS("CDsoFramerControl::XPersistStorage::Load\n");
> if (pStg == NULL)
> return E_INVALIDARG;
>
> HRESULT hr = E_FAIL;
>
> LPSTREAM pIStream;
> hr = pStg->OpenStream(OLESTR("Contents"), NULL,
> STGM_DIRECT | STGM_SHARE_EXCLUSIVE, 0, &pIStream);
> if (SUCCEEDED(hr))
> hr = pThis->m_xPersistStreamInit.Load(pIStream);
>
> pIStream->Release();
> return hr;
> }
>
> STDMETHODIMP CDsoFramerControl::XPersistStorage::SaveCompleted(IStorage *
> pStgNew)
> {
> METHOD_PROLOGUE(CDsoFramerControl, PersistStorage);
> ODS("CDsoFramerControl::XPersistStorage::SaveCompleted\n");
> return S_OK;
> }
>
> STDMETHODIMP CDsoFramerControl::XPersistStorage::HandsOffStorage(void)
> {
> METHOD_PROLOGUE(CDsoFramerControl, PersistStorage);
> ODS("CDsoFramerControl::XPersistStorage::HandsOffStorage\n");
> return S_OK;
> }
>
> //Step 3. modify XInternalUnknown::QueryInterface member function which
> exists in dsofcontrol.cpp
> // add following code before the line "else if (IID_IPersistPropertyBag ==
> riid)"
>
> else if (IID_IPersistStorage == riid)
> {
> *ppv = (IPersistStorage*)&(pThis->m_xPersistStorage);
> }
>
>
>
>
|
|
|
Goto Forum:
Current Time: Sun Jul 13 19:59:14 EDT 2025
Powered by FUDForum. Page generated in 1.04841 seconds
|