Changeset 627


Ignore:
Timestamp:
May 1, 2016, 8:01:59 AM (6 years ago)
Author:
roman
Message:

Fixed problem with early unload on devenum.dll (64-bit?) when SystemDeviceEnumerator? is released before monikers

Location:
trunk/DirectShowSpy
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/DirectShowSpy/DirectShowSpy.sln

    r617 r627  
    4242                {02A667BA-1492-4BDD-88A4-819AB1CA351B}.Debug|Win32.Build.0 = Debug|Win32
    4343                {02A667BA-1492-4BDD-88A4-819AB1CA351B}.Debug|x64.ActiveCfg = Debug|x64
    44                 {02A667BA-1492-4BDD-88A4-819AB1CA351B}.Debug|x64.Build.0 = Debug|x64
    4544                {02A667BA-1492-4BDD-88A4-819AB1CA351B}.Release Trace|Win32.ActiveCfg = Release|Win32
    4645                {02A667BA-1492-4BDD-88A4-819AB1CA351B}.Release Trace|Win32.Build.0 = Release|Win32
  • trunk/DirectShowSpy/DirectShowSpy.vcxproj

    r545 r627  
    159159      <ExceptionHandling>Async</ExceptionHandling>
    160160      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
    161       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
     161      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
    162162      <PrecompiledHeader>Use</PrecompiledHeader>
    163163      <WarningLevel>Level3</WarningLevel>
     
    198198      <ExceptionHandling>Async</ExceptionHandling>
    199199      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
    200       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
     200      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
    201201      <PrecompiledHeader>Use</PrecompiledHeader>
    202202      <WarningLevel>Level3</WarningLevel>
  • trunk/DirectShowSpy/SystemDeviceEnumeratorSpy.h

    r620 r627  
    246246
    247247        private:
     248                CObjectPtr<T> m_pT;
    248249                CComPtr<IMoniker> m_pMoniker;
    249250
     
    258259                        _Z4_THIS();
    259260                }
    260                 VOID Initialize(IMoniker* pMoniker)
    261                 {
    262                         _A(pMoniker);
    263                         _A(!m_pMoniker);
     261                VOID Initialize(T* pT, IMoniker* pMoniker)
     262                {
     263                        _A(pT && pMoniker);
     264                        _A(!m_pT && !m_pMoniker);
     265                        m_pT = pT;
    264266                        m_pMoniker = pMoniker;
    265267                }
     
    524526
    525527        private:
     528                CObjectPtr<T> m_pT;
    526529                CComPtr<IEnumMoniker> m_pEnumMoniker;
    527530
     
    536539                        _Z4_THIS();
    537540                }
    538                 VOID Initialize(IEnumMoniker* pEnumMoniker)
    539                 {
    540                         _A(pEnumMoniker);
    541                         _A(!m_pEnumMoniker);
     541                VOID Initialize(T* pT, IEnumMoniker* pEnumMoniker)
     542                {
     543                        _A(pT && pEnumMoniker);
     544                        _A(!m_pT && !m_pEnumMoniker);
     545                        // NOTE: T is references to make sure that m_hDevEnumModule is not unloaded too early (esp. after ~CSystemDeviceEnumeratorSpyT
     546                        //       but before ~CEnumMoniker)
     547                        m_pT = pT;
    542548                        m_pEnumMoniker = pEnumMoniker;
    543549                }
     
    546552                STDMETHOD(Next)(ULONG nElementCount, IMoniker** ppMoniker, ULONG* pnFetchElementCount) override
    547553                {
    548                         _Z4(atlTraceCOM, 4, _T("nElementCount %d\n"), nElementCount);
     554                        _Z4(atlTraceCOM, 4, _T("this 0x%p, nElementCount %d\n"), this, nElementCount);
    549555                        _ATLTRY
    550556                        {
     
    565571                                                        break;
    566572                                                CObjectPtr<CMoniker> pMonikerWrapper;
    567                                                 pMonikerWrapper.Construct()->Initialize(pMoniker);
     573                                                pMonikerWrapper.Construct()->Initialize(m_pT, pMoniker);
    568574                                                pMoniker = pMonikerWrapper;
    569575                                        }
     
    579585                STDMETHOD(Skip)(ULONG nElementCount) override
    580586                {
    581                         _Z4(atlTraceCOM, 4, _T("nElementCount %d\n"), nElementCount);
     587                        _Z4(atlTraceCOM, 4, _T("this 0x%p, nElementCount %d\n"), this, nElementCount);
    582588                        _ATLTRY
    583589                        {
     
    592598                STDMETHOD(Reset)() override
    593599                {
    594                         _Z4(atlTraceCOM, 4, _T("...\n"));
     600                        _Z4(atlTraceCOM, 4, _T("this 0x%p\n"), this);
    595601                        _ATLTRY
    596602                        {
     
    605611                STDMETHOD(Clone)(IEnumMoniker** ppEnumMoniker) override
    606612                {
    607                         _Z4(atlTraceCOM, 4, _T("...\n"));
     613                        _Z4(atlTraceCOM, 4, _T("this 0x%p\n"), this);
    608614                        _ATLTRY
    609615                        {
     
    612618                                _A(pEnumMoniker);
    613619                                CObjectPtr<CEnumMoniker> pEnumMonikerWrapper;
    614                                 pEnumMonikerWrapper.Construct()->Initialize(pEnumMoniker);
     620                                pEnumMonikerWrapper.Construct()->Initialize(m_pT, pEnumMoniker);
    615621                                pEnumMoniker = pEnumMonikerWrapper;
    616622                        }
     
    792798                                #pragma endregion
    793799                                CObjectPtr<CEnumMoniker> pEnumMonikerWrapper;
    794                                 pEnumMonikerWrapper.Construct()->Initialize(pEnumMoniker);
     800                                pEnumMonikerWrapper.Construct()->Initialize(static_cast<T*>(this), pEnumMoniker);
    795801                                pEnumMoniker = pEnumMonikerWrapper;
    796802                        }
Note: See TracChangeset for help on using the changeset viewer.