1

背景: .NET で Activex コントロールを開発しましたが、それを使用するさまざまなアプリケーションで安定性の問題が発生していることに気付きました。サンプルアプリケーションから、以下に概説する同様の不安定性を一連のステップで見つけることができました。

'CSActivex' (http://code.msdn.microsoft.com/windowsdesktop/CSActiveX-b86194f8) という Dev-Center の Web サイトからダウンロードした Activex コントロールのサンプルがあります。

ビルドはかなり簡単で、プロジェクトを VS2010 Express (C#) にロードし、.dll にコンパイルしました。

次に、VS2008 C++ からサンプル MFC アプリケーションを作成して、レガシー アプリケーションをモデル化しました (.NET は使用しません)。ターゲットは、[バージョン情報] ボックスを持つシンプルなダイアログ ベースの GUI です。

csactivex.dll を regasm に登録し、その dll を VS IDE フォルダーにコピーしただけなので、設計時に Activex コントロールを挿入し、次に Debug フォルダーに挿入して、実行時に見つけることができます。

設計時に CSActivex コントロールを About ダイアログ ボックスに挿入すると、何の驚きもなく表示されます。dll をビルドして Debug フォルダーにコピーし、デバッグ セッションを実行した後、アバウト ボックスに移動し続け、コントロールのさまざまな場所をクリックし、アバウト ダイアログを閉じて数回繰り返すと、アクセス違反に関するログを出力すると、次のようになります。

'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 のシンボルがロードされていませ ん
]
!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 code=2 ) 412 行目 + 0xd バイト C CSActivexMFC.exe!__tmainCRTStartup() 595 行目 C CSActivexMFC.exe!wWinMainCRTStartup() 399 行目 C kernel32.dll!7c817077()

私は誰かが以前にこれに遭遇したことを望んでいました.私は複数のマシン(自宅と職場)でこれに遭遇しており、少なくともCSActivexがすべきことをしていないか、MFCで何かをしている.

私の質問は、これらのサンプルをアクセス違反なしで機能させる方法です。

編集:

about ウィンドウを開いて閉じることを繰り返すだけで、最終的にデバッガーがクラッシュし (未処理の例外)、下にスタック トレースが表示されます。私には、破壊されたオブジェクトが再び破壊されているように見えますか?

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()  
4

1 に答える 1

1

ファーストチャンスの例外とは何かについて、DavidKlineによるこのMSDNブログをご覧ください。

ブログから

ファーストチャンス例外は、コードに問題があることを意味しますか?

ファーストチャンス例外メッセージは、ほとんどの場合、コードに問題があることを意味するものではありません。例外を適切に処理するアプリケーション/コンポーネントの場合、最初のチャンスの例外メッセージは、例外的な状況が発生して処理されたことを開発者に通知します。

例外処理のないコードの場合、デバッガーは2回目の例外通知を受け取り、未処理の例外で停止します。

また、 David Klineによる別のMSDNブログを見ると、最初のチャンスの例外で停止して、その原因を確認する方法がわかります。

そしてこのMSDNフォーラムの投稿

于 2012-06-27T02:48:44.257 に答える