2012-06-27 2 views
1

Фон: Я разработал элемент управления Activex в .NET, но обнаружил, что он вызывал проблемы стабильности в различных приложениях, которые его использовали. Мне удалось найти серию шагов из примеров приложений, похожих на нестабильность, описанных ниже.Нарушение прав доступа .NET Activex в приложении MFC

У меня есть пример управления ActiveX, который я скачал с сайта Dev-центр под названием «CSActivex» (http://code.msdn.microsoft.com/windowsdesktop/CSActiveX-b86194f8)

Это было довольно просто построить, я просто загрузил проект в VS2010 Express (C#) и скомпилировал его в .dll

Затем я создал образец приложения MFC из VS2008 C++ для моделирования устаревших приложений (он не используется. СЕТЬ). Цель - простой графический интерфейс, основанный на диалоге, который имеет поле «О программе».

Я зарегистрировал csactivex.dll с regasm и просто скопировал dll в папку VS IDE, поэтому я могу вставить элемент управления Activex во время разработки, а затем в папку Debug, чтобы его можно было найти во время выполнения.

Во время разработки я вставляю элемент управления CSActivex в диалоговое окно «О программе», оно не выглядит неожиданным. После создания и копирования dll в папку Debug и запуска сеанса отладки, если я постоянно перехожу к окну about, нажмите в разных местах элемента управления, закройте диалоговое окно и повторите несколько раз, я начну видеть сообщения в Вывод журнала о нарушениях доступа, и она начинает выглядеть следующим образом:

'CSActivexMFC.exe': Loaded 'C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Windows.Forms\63406259e94d5c0ff5b79401dfe113ce\System.Windows.Forms.ni.dll' 
'CSActivexMFC.exe': Loaded 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll' 
'CSActivexMFC.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.2600.5581_x-ww_dfbc4fc4\GdiPlus.dll' 
'CSActivexMFC.exe': Loaded 'C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\Accessibility\11eb4f6606ba01e5128805759121ea6c\Accessibility.ni.dll' 
First-chance exception at 0x00000000 in CSActivexMFC.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x00000000 in CSActivexMFC.exe: 0xC0000005: Access violation reading location 0x00000000. 
First-chance exception at 0x79f4c2f7 in CSActivexMFC.exe: 0xC0000005: Access violation reading location 0x0000000b. 
First-chance exception at 0x79f4c2f7 in CSActivexMFC.exe: 0xC0000005: Access violation reading location 0x0000000b. 

Хотя это не врезаться в отладчике, я не могу помочь, но думаю, что это не хорошо, и у меня есть ощущение, что это может быть связанными с нестабильностью других элементов управления .NET Activex. Если я смогу найти способ решить эту проблему, то такое же разрешение может помочь исходному контролю.

Я пытался нарушить исключение, но, похоже, это происходит в нескольких разных местах. один трассировки стека, когда я закрыл приложения ниже:

mscorwks.dll 79f4c2f7() [Фреймы ниже могут быть неправильными и/или отсутствует, никакие символы, загруженные для mscorwks.dll]
mscorwks.dll! 79f4c370() mscorwks.dll! 79faaa91()
mscorwks.dll! 79faa858() mscorwks.dll! 79faa9ad()
mscorwks.dll! 79faa9d9() mscorwks.dll! 7a079480()
mscorwks.dll! 7a0798e8 () mscorwks.dll! 7a043f25()
ole32.dll! 77525834() rpcrt4.dll! 77e799f4()
rpcrt4. Dll! 77ef421a() ntdll.dll! 7c915239()
ntdll.dll! 7c91542b() ntdll.dll! 7c91534a()
ntdll.dll! 7c915239() ntdll.dll! 7c91542b()
ntdll.dll! 7c91534a() ntdll.dll! 7c915f75()
ntdll.dll! 7c9155ed() ntdll.dll! 7c915ce9()
ntdll.dll! 7c96f07c() ole32.dll! 77600c15()
ole32.dll! 77600bbf () ole32.dll! 7752ad31()
ole32.dll! 7752ac56() ole32.dll! 7752b771()
ole32.dll! 77600e1f() ole32.dll! 7752b7ab()
ole32.dll! 7752b5e1() ole32 .dll! 7752b54e()
user32.dll! 7e418734() ole32.dll! 7752b54e()
ole32.dll! 7752b54e() ole32.dll!7752b54e()
ole32.dll! 7752b54e() ole32.dll! 7752f2d0()
ole32.dll! 7752f23e() ole32.dll! 77557237()
mscorwks.dll! 79f9e14d() Mscorwks.dll! 79f9e0b4 ()
mscorwks.dll! 79f9e018() mscorwks.dll! 79f4c879()
mscorwks.dll! 79f3bb76() mscoreei.dll! 603cc966()
mscoreei.dll! 603d1f25() mscoree.dll! 790186ad()

msvcr90d.dll! _ crtCorExitProcess (int status = 2) Линия 716 C msvcr90d.dll! _crtExitProcess (int status = 2) Строка 722 + 0x9 байт C msvcr90d.dll! Doexit (int code = 2, int quick = 0, int retcaller = 0) Строка 644 + 0x9 байт C msvcr90d.dll! Exit (int код = 2) Строка 412 + 0xd байт C CSActivexMFC.exe! __ tmainCRTStartup() Строка 595 C CSActivexMFC.exe! wWinMainCRTStartup() Строка 399 C kernel32.dll! 7c817077()

Я надеясь, что кто-то, возможно, столкнулся с этим раньше, я сталкиваюсь с этим на разных машинах (дома и на работе) и, по крайней мере, он сузился до проблемы с CSActivex, не делая что-то, что нужно, или что-то в MFC.

так что мой вопрос заключается в том, как заставить эти образцы работать без нарушений доступа?

Edit:

Просто открытие о окне и закрыть его повторно в конечном итоге приводит к аварии в отладчике (необработанное исключение) с трассировкой стеки ниже, для меня это выглядит как объект, который был деградировавшим разрушаются еще раз?

First-chance exception at 0x00400003 in CSActivexMFC.exe: 0xC0000005: Access violation writing location 0x00000000. 
First-chance exception at 0x00400003 in CSActivexMFC.exe: 0xC0000005: Access violation writing location 0x00000000. 
First-chance exception at 0x003a005c in CSActivexMFC.exe: 0xC0000096: Privileged instruction. 
First-chance exception at 0x00460020 in CSActivexMFC.exe: 0xC0000005: Access violation reading location 0x00460020. 
First-chance exception at 0x78b6ba1d (mfc90ud.dll) in CSActivexMFC.exe: 0xC0000005: Access violation writing location 0x00000018. 
Unhandled exception at 0x78b6ba1d (mfc90ud.dll) in CSActivexMFC.exe: 0xC0000005: Access violation writing location 0x00000018. 


    mfc90ud.dll!CDataSourceControl::~CDataSourceControl() Line 2431 + 0x2d bytes C++ 
mfc90ud.dll!CDataSourceControl::`scalar deleting destructor'() + 0x11 bytes C++ 
mfc90ud.dll!COleControlSite::~COleControlSite() Line 77 + 0x22 bytes C++ 
mfc90ud.dll!COleControlSite::`scalar deleting destructor'() + 0x11 bytes C++ 
mfc90ud.dll!COleControlSiteOrWnd::~COleControlSiteOrWnd() Line 161 + 0x24 bytes C++ 
mfc90ud.dll!COleControlSiteOrWnd::`scalar deleting destructor'() + 0x11 bytes C++ 
mfc90ud.dll!COleControlContainer::~COleControlContainer() Line 199 + 0x1c bytes C++ 
mfc90ud.dll!COleControlContainer::`scalar deleting destructor'() + 0x11 bytes C++ 
mfc90ud.dll!CWnd::OnDestroy() Line 786 + 0x24 bytes C++ 
mfc90ud.dll!CWnd::OnWndMsg(unsigned int message=2, unsigned int wParam=0, long lParam=0, long * pResult=0x0012f510) Line 2042 C++ 
mfc90ud.dll!CWnd::WindowProc(unsigned int message=2, unsigned int wParam=0, long lParam=0) Line 1755 + 0x20 bytes C++ 
mfc90ud.dll!AfxCallWndProc(CWnd * pWnd=0x0012f88c, HWND__ * hWnd=0x002c04fc, unsigned int nMsg=2, unsigned int wParam=0, long lParam=0) Line 240 + 0x1c bytes C++ 
mfc90ud.dll!AfxWndProc(HWND__ * hWnd=0x002c04fc, unsigned int nMsg=2, unsigned int wParam=0, long lParam=0) Line 403 C++ 
mfc90ud.dll!AfxWndProcBase(HWND__ * hWnd=0x002c04fc, unsigned int nMsg=2, unsigned int wParam=0, long lParam=0) Line 441 + 0x15 bytes C++ 
user32.dll!7e418734() 
[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]  
user32.dll!7e418816() 
mfc90ud.dll!CThreadSlotData::GetThreadValue(int nSlot=6623744) Line 268 C++ 
user32.dll!7e428eec() 
ntdll.dll!7c90e473()  
user32.dll!7e42b1a8() 
mfc90ud.dll!CWnd::DestroyWindow() Line 1007 + 0xd bytes C++ 
90909090() 
+0

Вы должны быть в состоянии вызвать * старый * прочее * из * .Net (используя Interop) ... но вы, конечно, не должны писать любой * новый * материал в ActiveX, если вы может избежать этого. Это вдвойне для MFC! IMHO ... – paulsm4

+0

Одним из ограничений является поддержка старых приложений, которые знают только об Activex, а не .NET..i.e. например, VB6 – PeskyGnat

+1

http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-the-of-the-offload-exception-user-mode-callback-exceptions-in-x64/ –

ответ

1

Взгляните на эту MSDN Blog by David Kline на Что такое исключение Первый шанс.

Из блога

Означает ли первый шанс исключение есть проблема в моем коде?

Первое сообщение об исключении случайности чаще всего не означает, что в коде есть проблема. Для приложений/компонентов, которые изящно обрабатывают исключения, сообщения об исключительных случайных исключениях позволяют разработчику знать, что была обнаружена исключительная ситуация и была обработана.

Для обработки кода без исключений отладчик получит второе уведомление об исключении случайных ситуаций и остановится с необработанным исключением.

И, посмотрев на другой MSDN Blog by David Kline, он расскажет вам, как остановиться на исключении первого шанса, чтобы увидеть, что вызвало его.

И это MSDN Forum Posting

+0

чтение адресов, что низкий означает, что указатели на нуль разыменовываются, что не очень хорошо , –

+0

@ShengJiang 蒋 晟 Я не сказал, что проблем не было, но это нормально, но это не так, потому что оно возникает, прежде чем оно будет обработано кодом пользователя. Плюс я дал несколько ссылок о том, как сузить вопрос. –

+0

В следующем коде будут генерироваться те же исключения первого шанса на доступ к виду доступа до фактического сбоя после многих итераций \t int x [1]; int i = 0; while (true) { x [i ++] = 0; } Итак, у меня такое чувство, что я вижу в отладчике, не является доброкачественным – PeskyGnat

Смежные вопросы