Avatar billede eonix Nybegynder
23. januar 2007 - 09:57 Der er 6 kommentarer og
1 løsning

En lækker Access violation error i et WMP Plug-in

Hej allesammen,

Dette er måske en af de noget sværere spørgsmål, men jeg håber stadigt at der er nogen af jer derude der har arbejdet med c++ og måske kan se hvad det er der gøres forkert.

Først og fremmest handler dette om opbygningen af et Plug-in til Windows Media Player - i den forbindelse har jeg fundet en artikel der forklarer hvordan man danner et interface af typen _IWMPPluginUI med det GUID som det oprindelige interface har.

For at forstå mit spørgsmål helt beder jeg jer gå til følgende hjemmeside:

http://www.microsoft.com/belux/msdn/nl/community/columns/munoz/extendwmp_part1.mspx
Direkte link til kodeeksempel:
http://download.microsoft.com/download/d/f/c/dfc7a022-3426-4868-b23c-3818a6e54305/hellowmp.zip

På ovenstående hjemmeside og download-link er hele guiden for hele implementeringen af et Windows Media Player plug-in i Visual C++ - vedkommende benytter sig af en Com Callable Wrapper, som er fint nok og ser ud til at fungerer MEN, der sker en fejl i eksemplet i forbindelse med deaktivering og reaktivering af et plug-in.

Så vidt jeg har fundet ud af fungerer følgende ikke:

public:
    CAggregateHelper() :
          m_RefCount(0),
          m_Inner(nullptr),
          m_InQI(false)
        {
        }

        virtual ~CAggregateHelper()
        {

        // release the inner object
        if (m_Inner != nullptr)
        m_Inner->Release();
        // dispose the inner GC object
        IDisposable^ disp = dynamic_cast<IDisposable^>((Object^)m_InnerRef);
        if (disp != nullptr)
        disp->Dispose();

        }

Det vi ser her er en constructor og en deconstructor af CAggregateHelper() hvor der i deconstructoren bliver udført et nullptr-check på disp, hvor efter funktionen Dispose() forsøges udført - Dette BURDE være muligt - men ifølge Visual Studio 2005 og MSDN er det ikke muligt kalde Dispose() i præcist dette tilfælde fordi:

Error 1 error C2039: 'Dispose' : is not a member of 'System::IDisposable'   
c:\hellowmp\hellowmp\aggregate.h  47   


Fair nok tænker jeg så og undersøge hvilke løsninger der er på C2039 - MSDN har følgende forklaring:

"C2039 can occur when attempting to write code that will deterministic release of your managed or unmanaged resources. For more information, see Destructors and Finalizers in Visual C++."

Ved ikke helt hvad jeg kan bruge det til så begynder at Google efter problemet og finder så følgende:

http://groups-beta.google.com/group/microsoft.public.windowsmedia.sdk/browse_thread/thread/19e8c29ac0786599?hl=en

Her er en person 100% ligesom jeg igang med at bruge den fremgangsmåde som vist i guiden øvert i dette spørgsmål. Han er endda nået et skridt videre og mener at have løst "Dispose" problemet ved at slette objectet "disp" i stedet for at prøve at udfører dens Dispose() funktion.

Jeg forsøger at gøre hvad ham fra google fandt ud af, men fejlen som ham fra google også havde fundet, er der stadigt :(

FEJLEN BESTÅR I ALT SIN ENKELTHED I FØLGENDE:

1: AKTIVERING AF PLUG-IN = SUCCESS
2: DEAKTIVERING AF PLUG-IN = SUCCESS
3: REAKTIVERING AF PLUG-IN, i SAMME WMP = Access violation:

Følgende er nu ALT det information jeg kan finde omkring fejlen, via stacktrace og google osv.

1: Via DEBUG funktionen i Visual Studio 2005:

"Unhandled exception at 0xabababab in wmplayer.exe: 0xC0000005: Access violation reading location 0xabababab."

2: Ved at stacktrace til det sted hvor ovenstående exception sker:

"7c90EB8D sysenter"

3: Ved at undersøge hvad sysenter er på google har jeg funder ud af:

sysenter er en funktion der kaldes for at optimerer udførslen via et processorkald - men jeg aner intet om hvordan og hvorfor - det kan være uden betydning - jeg aner det ikke.
http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8223/


Vedkommende fra Google mente at have løst netop denne Access violation, men vedkommende svarer ikke på hans email - heller ikke udvikleren der står bag den originale artikel giver lyd fra sig - så nu spørger jeg alle jer her på eksperten - om i ved hvordan man går hen og løser et sådan et Access violation problem.

Jeg formoder det har noget med destructionen af inner og outer objecter, som så muligvis ikke eksisterer på de tidspunkter det er nødvendigt for at reaktivere et plug-in - men det er ikke ligefrem en løsning.


Jeg håber VIRKELIGT at nogen kan finde en løsning.


Venlig hilsen

EoniX
Avatar billede segmose Nybegynder
23. januar 2007 - 14:09 #1
if (disp != nullptr) {
  delete disp;
  disp = nullptr; // da jeg ikke ved noget om managed ved jeg ikke om du må dette.
}
Får du nu en anden fejl?

Ellers ville jeg gætte på at dit step 2: sletter dele eller hele plug-in eller dennes data så step 3: står med en uinitialiseret pointer.
Avatar billede segmose Nybegynder
23. januar 2007 - 14:10 #2
Er den kode C# eller delphi?
Avatar billede eonix Nybegynder
23. januar 2007 - 16:43 #3
Det er C++

Jeg forsøger lige at sætte disp til nullptr i destructoren, mener dog at have forsøgt dette før.

Angående dit gæt - så tror jeg også det er det der er tilfældet - men spørgsmålet er så hvordan jeg sikrer at det ikke sker - nogle forslag ? - al kildekoden er tilgængelig via linket i posted.
Avatar billede eonix Nybegynder
23. januar 2007 - 16:57 #4
At sætte disp til nullptr gjorde detsværre ingenting :(
Avatar billede kenneth_gorking Nybegynder
24. januar 2007 - 16:54 #5
0xabababab er helt sikkert en ugyldig addresse, så det betyder nok at 'disp' allrede er slettet. Desuden, I det kode jeg kigger på siger den:

virtual ~CAggregateHelper()
{
    // release the inner object
    if (m_Inner != nullptr)
        m_Inner->Release();
    // dispose the inner GC object
    delete (Object^)m_InnerRef;
}
Avatar billede eonix Nybegynder
24. januar 2007 - 19:45 #6
Hmmm - udvikleren ser ud til at have lavet om på koden - jeg undersøger lige om fejlen er der endnu.
Avatar billede eonix Nybegynder
25. januar 2007 - 09:50 #7
Fejlen eksisterer endnu - men udvikleren har givet lyd fra sig - problemet er nu drejet til noget andet - derfor lukker jeg dette spørgsmål og henviser til det spørgsmål det egentligt drejer sig om - (http://www.eksperten.dk/spm/758285) nemlig hvordan man ryder op i .NET's Cache af COM metadata.

//EoniX

LUKKET
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester