[vlc-devel] [PATCH] activex: win64 fixes

Sergey Radionov rsatom at gmail.com
Wed Mar 21 04:02:59 CET 2012


2011/11/14 Sergey Radionov <rsatom at gmail.com>:
> I think that with new event notify system (based on windows messages,
> ed0d3720c39d49205..), we don't need IGlobalInterfaceTable at all. We are in
> single threaded apartment, and have no interthread calls now. So we can
> considerably simplify connectioncontainer.cpp and linked things.
corresponding patch:
https://github.com/RSATom/gtk-npapi-vlc/commit/3d7d536bf85acbc9d6fb76d937131d0c0e8ccf70

>
> But this idea must be checked carefully. I am not absolutely shure.
>
> 13.11.2011 9:11, Rafaël Carré пишет:
>>
>> GlobalInterfaceTable seems to be abused for storing pointers instead of
>> 32 bits "cookies".
>> On win32 it seems the cookies happen to be equal to the pointer stored
>> Change the connection map to store the 32 bits cookies
>> Extend template to fetch the pointer from the cookie in
>> VLCEnumConnectionsDereference
>>
>> activex plugin is now in the same state than win32:
>> using share/test.html doesn't display any video and the state correctly
>> displays "error"
>> ---
>>  activex/connectioncontainer.cpp |   69
>> ++++++++++++++++++++++++--------------
>>  activex/connectioncontainer.h   |    2 +-
>>  activex/dataobject.cpp          |    7 ++--
>>  activex/utils.h                 |   18 ++++++----
>>  4 files changed, 59 insertions(+), 37 deletions(-)
>>
>> diff --git a/activex/connectioncontainer.cpp
>> b/activex/connectioncontainer.cpp
>> index 7d3800c..a454202 100644
>> --- a/activex/connectioncontainer.cpp
>> +++ b/activex/connectioncontainer.cpp
>> @@ -31,27 +31,43 @@
>>  #include<rpc.h>
>>  #include<rpcndr.h>
>>
>> +#include<_mingw.h>
>> +
>>  using namespace std;
>>
>>
>>  ////////////////////////////////////////////////////////////////////////////////////////////////
>> +
>> +#ifndef __MINGW64_VERSION_MAJOR
>>  DEFINE_GUID(IID_IGlobalInterfaceTable,     0x00000146, 0x0000, 0x0000,
>> 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
>> +const GUID  IID_IGlobalInterfaceTable = { 0x00000146, 0, 0, {0xc0, 0, 0,
>> 0, 0, 0, 0, 0x46} };
>> +#endif
>> +
>>  DEFINE_GUID(CLSID_StdGlobalInterfaceTable, 0x00000323, 0x0000, 0x0000,
>> 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46);
>>
>> -const GUID  IID_IGlobalInterfaceTable = { 0x00000146, 0, 0, {0xc0, 0, 0,
>> 0, 0, 0, 0, 0x46} };
>>  const CLSID CLSID_StdGlobalInterfaceTable = { 0x00000323, 0, 0, {0xc0, 0,
>> 0, 0, 0, 0, 0, 0x46} };
>>
>>  ////////////////////////////////////////////////////////////////////////////////////////////////
>>
>>  /* this function object is used to return the value from a map pair */
>>  struct VLCEnumConnectionsDereference
>>  {
>> -    CONNECTDATA operator()(const map<DWORD,LPUNKNOWN>::iterator&  i)
>> +    CONNECTDATA operator()(const map<DWORD,DWORD>::iterator&  i, REFIID
>> iid)
>>      {
>>          CONNECTDATA cd;
>> +        LPUNKNOWN p;
>> +        IGlobalInterfaceTable *m_pGIT;
>> +
>> +        // Get the Global Interface Table per-process singleton:
>> +        CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0,
>> +                CLSCTX_INPROC_SERVER,
>> +                IID_IGlobalInterfaceTable,
>> +                reinterpret_cast<void**>(&m_pGIT));
>> +        HRESULT hr = m_pGIT->GetInterfaceFromGlobal( i->second, iid,
>> reinterpret_cast<void**>(&p));
>> +        assert( SUCCEEDED(hr) );
>>
>> -        i->second->AddRef();
>> +        p->AddRef();
>>
>>          cd.dwCookie = i->first;
>> -        cd.pUnk     = i->second;
>> +        cd.pUnk     = p;
>>          return cd;
>>      };
>>  };
>> @@ -59,16 +75,16 @@ struct VLCEnumConnectionsDereference
>>  class VLCEnumConnections : public VLCEnumIterator<IID_IEnumConnections,
>>      IEnumConnections,
>>      CONNECTDATA,
>> -    map<DWORD,LPUNKNOWN>::iterator,
>> +    map<DWORD,DWORD>::iterator,
>>      VLCEnumConnectionsDereference>
>>  {
>>  public:
>> -    VLCEnumConnections(map<DWORD,LPUNKNOWN>  &m) :
>> +    VLCEnumConnections(map<DWORD,DWORD>  &m, REFIID iid) :
>>          VLCEnumIterator<IID_IEnumConnections,
>>              IEnumConnections,
>>              CONNECTDATA,
>> -            map<DWORD,LPUNKNOWN>::iterator,
>> -            VLCEnumConnectionsDereference>  (m.begin(), m.end())
>> +            map<DWORD,DWORD>::iterator,
>> +            VLCEnumConnectionsDereference>  (m.begin(), m.end(), iid)
>>      {};
>>  };
>>
>> @@ -77,8 +93,9 @@ public:
>>  /* this function object is used to retain the dereferenced iterator value
>> */
>>  struct VLCEnumConnectionPointsDereference
>>  {
>> -    LPCONNECTIONPOINT operator()(const
>> vector<LPCONNECTIONPOINT>::iterator&  i)
>> +    LPCONNECTIONPOINT operator()(const
>> vector<LPCONNECTIONPOINT>::iterator&  i, REFIID iid)
>>      {
>> +        (void)iid;
>>          LPCONNECTIONPOINT cp = *i;
>>          cp->AddRef();
>>          return cp;
>> @@ -92,12 +109,12 @@ class VLCEnumConnectionPoints: public
>> VLCEnumIterator<IID_IEnumConnectionPoints,
>>      VLCEnumConnectionPointsDereference>
>>  {
>>  public:
>> -    VLCEnumConnectionPoints(vector<LPCONNECTIONPOINT>&  v) :
>> +    VLCEnumConnectionPoints(vector<LPCONNECTIONPOINT>&  v, REFIID iid) :
>>          VLCEnumIterator<IID_IEnumConnectionPoints,
>>              IEnumConnectionPoints,
>>              LPCONNECTIONPOINT,
>>              vector<LPCONNECTIONPOINT>::iterator,
>> -            VLCEnumConnectionPointsDereference>  (v.begin(), v.end())
>> +            VLCEnumConnectionPointsDereference>  (v.begin(), v.end(),
>> iid)
>>      {};
>>  };
>>
>> @@ -265,12 +282,12 @@
>> VLCConnectionPoint::VLCConnectionPoint(IConnectionPointContainer *p_cpc,
>> REFIID
>>  VLCConnectionPoint::~VLCConnectionPoint()
>>  {
>>      // Revoke interfaces from the GIT:
>> -    map<DWORD,LPUNKNOWN>::iterator end = _connections.end();
>> -    map<DWORD,LPUNKNOWN>::iterator iter = _connections.begin();
>> +    map<DWORD,DWORD>::iterator end = _connections.end();
>> +    map<DWORD,DWORD>::iterator iter = _connections.begin();
>>
>>      while( iter != end )
>>      {
>> -        m_pGIT->RevokeInterfaceFromGlobal((DWORD)iter->second);
>> +        m_pGIT->RevokeInterfaceFromGlobal(iter->second);
>>          ++iter;
>>      }
>>      m_pGIT->Release();
>> @@ -311,7 +328,7 @@ STDMETHODIMP VLCConnectionPoint::Advise(IUnknown
>> *pUnk, DWORD *pdwCookie)
>>          if( SUCCEEDED(hr) )
>>          {
>>              *pdwCookie = ++dwCookieCounter;
>> -            _connections[*pdwCookie] = (LPUNKNOWN) dwGITCookie;
>> +            _connections[*pdwCookie] = dwGITCookie;
>>          }
>>          pUnk->Release();
>>      }
>> @@ -320,10 +337,10 @@ STDMETHODIMP VLCConnectionPoint::Advise(IUnknown
>> *pUnk, DWORD *pdwCookie)
>>
>>  STDMETHODIMP VLCConnectionPoint::Unadvise(DWORD pdwCookie)
>>  {
>> -    map<DWORD,LPUNKNOWN>::iterator pcd =
>> _connections.find((DWORD)pdwCookie);
>> +    map<DWORD,DWORD>::iterator pcd = _connections.find((DWORD)pdwCookie);
>>      if( pcd != _connections.end() )
>>      {
>> -        m_pGIT->RevokeInterfaceFromGlobal((DWORD)pcd->second);
>> +        m_pGIT->RevokeInterfaceFromGlobal(pcd->second);
>>          _connections.erase(pdwCookie);
>>          return S_OK;
>>      }
>> @@ -335,24 +352,23 @@ STDMETHODIMP
>> VLCConnectionPoint::EnumConnections(IEnumConnections **ppEnum)
>>      if( NULL == ppEnum )
>>          return E_POINTER;
>>
>> -    *ppEnum = dynamic_cast<LPENUMCONNECTIONS>(new
>> VLCEnumConnections(_connections));
>> +    *ppEnum = dynamic_cast<LPENUMCONNECTIONS>(new
>> VLCEnumConnections(_connections, _iid));
>>
>>      return (NULL != *ppEnum ) ? S_OK : E_OUTOFMEMORY;
>>  };
>>
>>  void VLCConnectionPoint::fireEvent(DISPID dispId, DISPPARAMS
>> *pDispParams)
>>  {
>> -    map<DWORD,LPUNKNOWN>::iterator end = _connections.end();
>> -    map<DWORD,LPUNKNOWN>::iterator iter = _connections.begin();
>> +    map<DWORD,DWORD>::iterator end = _connections.end();
>> +    map<DWORD,DWORD>::iterator iter = _connections.begin();
>>
>>      HRESULT hr = S_OK;
>>
>>      while( iter != end )
>>      {
>> -        DWORD dwCookie = (DWORD)iter->second;
>>          LPUNKNOWN pUnk;
>>
>> -        hr = m_pGIT->GetInterfaceFromGlobal( dwCookie, _iid,
>> +        hr = m_pGIT->GetInterfaceFromGlobal( iter->second, _iid,
>>                                               reinterpret_cast<void
>> **>(&pUnk) );
>>          if( SUCCEEDED(hr) )
>>          {
>> @@ -372,15 +388,15 @@ void VLCConnectionPoint::fireEvent(DISPID dispId,
>> DISPPARAMS *pDispParams)
>>
>>  void VLCConnectionPoint::firePropChangedEvent(DISPID dispId)
>>  {
>> -    map<DWORD,LPUNKNOWN>::iterator end = _connections.end();
>> -    map<DWORD,LPUNKNOWN>::iterator iter = _connections.begin();
>> +    map<DWORD,DWORD>::iterator end = _connections.end();
>> +    map<DWORD,DWORD>::iterator iter = _connections.begin();
>>
>>      while( iter != end )
>>      {
>>          LPUNKNOWN pUnk;
>>          HRESULT hr;
>>
>> -        hr = m_pGIT->GetInterfaceFromGlobal( (DWORD)iter->second,
>> IID_IUnknown,
>> +        hr = m_pGIT->GetInterfaceFromGlobal( iter->second, IID_IUnknown,
>>                                                reinterpret_cast<void
>> **>(&pUnk) );
>>          if( SUCCEEDED(hr) )
>>          {
>> @@ -461,7 +477,8 @@ STDMETHODIMP
>> VLCConnectionPointContainer::EnumConnectionPoints(LPENUMCONNECTIONP
>>      if( NULL == ppEnum )
>>          return E_POINTER;
>>
>> -    *ppEnum = dynamic_cast<LPENUMCONNECTIONPOINTS>(new
>> VLCEnumConnectionPoints(_v_cps));
>> +    const IID iid = {0x0,0x0,0x0,{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}};
>> +    *ppEnum = dynamic_cast<LPENUMCONNECTIONPOINTS>(new
>> VLCEnumConnectionPoints(_v_cps, iid));
>>
>>      return (NULL != *ppEnum ) ? S_OK : E_OUTOFMEMORY;
>>  };
>> diff --git a/activex/connectioncontainer.h b/activex/connectioncontainer.h
>> index 4f22504..f2d8052 100644
>> --- a/activex/connectioncontainer.h
>> +++ b/activex/connectioncontainer.h
>> @@ -73,7 +73,7 @@ private:
>>      REFIID _iid;
>>      IGlobalInterfaceTable *m_pGIT;
>>      IConnectionPointContainer *_p_cpc;
>> -    std::map<DWORD, LPUNKNOWN>  _connections;
>> +    std::map<DWORD, DWORD>  _connections;
>>  };
>>
>>
>>  //////////////////////////////////////////////////////////////////////////
>> diff --git a/activex/dataobject.cpp b/activex/dataobject.cpp
>> index e784096..f91b784 100644
>> --- a/activex/dataobject.cpp
>> +++ b/activex/dataobject.cpp
>> @@ -52,11 +52,11 @@ class VLCEnumFORMATETC : public
>> VLCEnumIterator<IID_IEnumFORMATETC,
>>      vector<FORMATETC>::iterator>
>>  {
>>  public:
>> -    VLCEnumFORMATETC(vector<FORMATETC>  v) :
>> +    VLCEnumFORMATETC(vector<FORMATETC>  v, REFIID iid) :
>>          VLCEnumIterator<IID_IEnumFORMATETC,
>>          IEnumFORMATETC,
>>          FORMATETC,
>> -        vector<FORMATETC>::iterator>(v.begin(), v.end())
>> +        vector<FORMATETC>::iterator>(v.begin(), v.end(), iid)
>>      {};
>>  };
>>
>> @@ -99,7 +99,8 @@ STDMETHODIMP VLCDataObject::EnumFormatEtc(DWORD
>> dwDirection,
>>      if( NULL == ppEnum )
>>          return E_POINTER;
>>
>> -    *ppEnum = new VLCEnumFORMATETC(_v_formatEtc);
>> +     const IID iid = {0x0,0x0,0x0,{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}};
>> +    *ppEnum = new VLCEnumFORMATETC(_v_formatEtc, iid);
>>
>>      return (NULL != *ppEnum ) ? S_OK : E_OUTOFMEMORY;
>>  };
>> diff --git a/activex/utils.h b/activex/utils.h
>> index 6234ab3..838a576 100644
>> --- a/activex/utils.h
>> +++ b/activex/utils.h
>> @@ -49,8 +49,9 @@ extern LPWSTR CombineURL(LPCWSTR baseUrl, LPCWSTR url);
>>  template<typename T, class Iterator>
>>  struct VLCDereference
>>  {
>> -    T operator()(const Iterator&  i) const
>> +    T operator()(const Iterator&  i, REFIID iid) const
>>      {
>> +        (void)iid;
>>          return *i;
>>      };
>>  };
>> @@ -61,19 +62,21 @@ class VLCEnumIterator : public Enumerator
>>
>>  public:
>>
>> -    VLCEnumIterator(const Iterator&  from, const Iterator&  to) :
>> +    VLCEnumIterator(const Iterator&  from, const Iterator&  to, REFIID
>> iid) :
>>          _refcount(1),
>>          _begin(from),
>>          _curr(from),
>> -        _end(to)
>> +        _end(to),
>> +        _iid(iid)
>>      {};
>>
>> -    VLCEnumIterator(const VLCEnumIterator&  e) :
>> +    VLCEnumIterator(const VLCEnumIterator&  e, REFIID iid) :
>>          Enumerator(),
>>          _refcount(e._refcount),
>>          _begin(e._begin),
>>          _curr(e._curr),
>> -        _end(e._end)
>> +        _end(e._end),
>> +        _iid(iid)
>>      {};
>>
>>      virtual ~VLCEnumIterator()
>> @@ -125,7 +128,7 @@ public:
>>
>>          while( (c<  celt)&&  (_curr != _end) )
>>
>>          {
>> -            rgelt[c] = dereference(_curr);
>> +            rgelt[c] = dereference(_curr, _iid);
>>              ++_curr;
>>              ++c;
>>          }
>> @@ -158,7 +161,7 @@ public:
>>      {
>>          if( NULL == ppEnum )
>>              return E_POINTER;
>> -        *ppEnum = dynamic_cast<Enumerator *>(new VLCEnumIterator(*this));
>> +        *ppEnum = dynamic_cast<Enumerator *>(new VLCEnumIterator(*this,
>> _iid));
>>          return (NULL != *ppEnum ) ? S_OK : E_OUTOFMEMORY;
>>      };
>>
>> @@ -166,6 +169,7 @@ private:
>>
>>      LONG     _refcount;
>>      Iterator _begin, _curr, _end;
>> +    REFIID _iid;
>>
>>      Dereference dereference;
>>
>
> --
> With best wishes,
> Sergey Radionov



More information about the vlc-devel mailing list