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