トップ回答者
Office 365 solo を使った VSTO デバッグ

質問
-
PowerPoint の VSTO アドインを製作しています。
今回 Office 2016 対応の確認のために、Office 365 solo を入手し、動作確認を行ったところ PowerPoint 終了時に PowerPoint がクラッシュするという現象に見舞われました。
この症状について、どう扱ったら良いのか、ご存知の方がおられましたら是非ご教示いただきたくお願いします。
詳細は以下のとおりです。
Office 365 solo がインストールされたマシン上で Visual Studio 2015 Pro で 「PowerPoint 2013 と 2016 VSTO アドイン」プロジェクトを新規に作成、一切手を加えずに Debug - AnyCPU でビルドし、デバッグ実行を開始。PowerPoint が起動したらそのまま PowerPoint を終了。すると PowerPoint が「Microsoft PowerPoint により情報を回復しています」というダイアログを表示、デバッガの出力には「プログラム '[5276] powerpnt.exe' はコード -1073741819 (0xc0000005) 'Access violation' で終了しました。」との表示が現れるというものです。
デバッグ出力を見ていると PowerPoint を終了させると各種DLLをアンロードしたあと5~6秒間ブロックされた状態が続き、その後 Access violation となります。DLL のアンロードに失敗しているようには見えませんでした。また頻度としては 100% です。なお Office はサインインしています。また Defender や Fire Wall を無効にしてみても改善されませんでした。
この症状は以下の複数のマシン構成で確認できました
- Windows7(64bit)+Office(32bit)+VS2015
- Windows10(64bit)+Office(64bit)+VS2015
- Windows10(64bit)+Office(32bit)+VS2015
すべて Windows Update で 2015/12/15 現在の最新状況に更新しております。また最後のシステムについては Windows の新規インストールから始め、Office, Visual Studio のみインストールした環境となります。
個人的には Office の認証がらみで何かあるのではないかと思っておりますが、これといった情報が見つからなかったのでどう扱うべきか困惑している次第です。繰り返しとなりますが、何かご教示いただければ幸いです。
回答
-
アドインが無くてもデバッガをアタッチしたままにして終了してるとなりますね。VSのバージョンも関係ないみたいです。
Office 365 Enterprise E3で2016はエラーになりますが2013ではエラーにならない。
- Win10日本語版+Office2016日本語版 + VS2015
- Win8.1日本語版+Office2016日本語版 + VS2015
- Win8.1日本語版+Office2016日本語版(64) + VS2015
- Win8.1日本語版+Office2016日本語版 + VS2013
- Win8.1日本語版+Office2016日本語版 + VS2010
- Win8.1日本語版+Office2016日本語版 + VS2013(リモートデバッグ)
- Win7日本語版+Office2016日本語版 + VS2013(リモートデバッグ)
- Win8.1英語版+Office2016英語版 + VS2015
リモートデバッガでエラーを捕まえてみるとスタックフレームはPowerPoint以外にもExcelやWordでも全部以下のような感じでエラーになってます。
何かしらのフォルダの解放処理でレジストリへのアクセスが失敗しているっぽいとまではわかるのですが…デバッガをアッタッチしてるとなる原因は思いつかないですし、認証がらみかも判断できないです。
ntdll.dll!_NtClose@4() 不明
KernelBase.dll!_RegCloseKey@4() 不明
shlwapi.dll!CRegPropertyBag::`vector deleting destructor'(unsigned int) 不明
shlwapi.dll!CBasePropertyBag::Release(void) 不明
shell32.dll!CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy>::`vector deleting destructor'(unsigned int) 不明
shell32.dll!CTRefBase<class kfapi::CKnownFolderDefinition,struct IUnknown,class CTRefBase_NoModuleLifetimePolicy>::Release(void) 不明
shell32.dll!std::_Tree<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::_Erase(struct std::_Tree_nod<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::_Node *) 不明
shell32.dll!std::_Tree<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::_Erase(struct std::_Tree_nod<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::_Node *) 不明
shell32.dll!std::_Tree<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::clear(void) 不明
shell32.dll!std::_Tree<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::erase(class std::_Tree<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::iterator,class std::_Tree<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::thro 不明
shell32.dll!kfapi::CFolderDefinitionCache::~CFolderDefinitionCache(void) 不明
shell32.dll!kfapi::CFolderDefinitionCache::Release(void) 不明
shell32.dll!SafeRelease<class kfapi::CFolderDefinitionCache>(class kfapi::CFolderDefinitionCache * *) 不明
shell32.dll!kfapi::CFolderCache::~CFolderCache(void) 不明
shell32.dll!kfapi::CFolderCache::Release(void) 不明
shell32.dll!kfapi::CKFFacade::Release(void) 不明
shell32.dll!kfapi::CKFFacade::s_Term(void) 不明
shell32.dll!_CleanupProcessAttachStuff(void) 不明
shell32.dll!_ProcessDetach(int) 不明
shell32.dll!_DllMain@12() 不明
shell32.dll!___CppXcptFilter() 不明
ntdll.dll!_LdrxCallInitRoutine@16() 不明
ntdll.dll!LdrpCallInitRoutine() 不明
ntdll.dll!LdrShutdownProcess() 不明
ntdll.dll!RtlExitUserProcess() 不明
kernel32.dll!_ExitProcessImplementation@4() 不明
ucrtbase.dll!_swprintf() 不明
ucrtbase.dll!_swprintf() 不明
ucrtbase.dll!_exit() 不明
デバッガをでデタッチしてから終了すればエラーにならないのですが、毎回でタッチするのは面倒ですね。
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク 星 睦美 2016年1月7日 0:36
すべての返信
-
アドインが無くてもデバッガをアタッチしたままにして終了してるとなりますね。VSのバージョンも関係ないみたいです。
Office 365 Enterprise E3で2016はエラーになりますが2013ではエラーにならない。
- Win10日本語版+Office2016日本語版 + VS2015
- Win8.1日本語版+Office2016日本語版 + VS2015
- Win8.1日本語版+Office2016日本語版(64) + VS2015
- Win8.1日本語版+Office2016日本語版 + VS2013
- Win8.1日本語版+Office2016日本語版 + VS2010
- Win8.1日本語版+Office2016日本語版 + VS2013(リモートデバッグ)
- Win7日本語版+Office2016日本語版 + VS2013(リモートデバッグ)
- Win8.1英語版+Office2016英語版 + VS2015
リモートデバッガでエラーを捕まえてみるとスタックフレームはPowerPoint以外にもExcelやWordでも全部以下のような感じでエラーになってます。
何かしらのフォルダの解放処理でレジストリへのアクセスが失敗しているっぽいとまではわかるのですが…デバッガをアッタッチしてるとなる原因は思いつかないですし、認証がらみかも判断できないです。
ntdll.dll!_NtClose@4() 不明
KernelBase.dll!_RegCloseKey@4() 不明
shlwapi.dll!CRegPropertyBag::`vector deleting destructor'(unsigned int) 不明
shlwapi.dll!CBasePropertyBag::Release(void) 不明
shell32.dll!CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy>::`vector deleting destructor'(unsigned int) 不明
shell32.dll!CTRefBase<class kfapi::CKnownFolderDefinition,struct IUnknown,class CTRefBase_NoModuleLifetimePolicy>::Release(void) 不明
shell32.dll!std::_Tree<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::_Erase(struct std::_Tree_nod<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::_Node *) 不明
shell32.dll!std::_Tree<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::_Erase(struct std::_Tree_nod<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::_Node *) 不明
shell32.dll!std::_Tree<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::clear(void) 不明
shell32.dll!std::_Tree<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::erase(class std::_Tree<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::throwing_allocator<struct std::pair<struct _GUID const ,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> > > >,0> >::iterator,class std::_Tree<class std::_Tmap_traits<struct _GUID,class ATL::CComPtr<class CTRefObj<class kfapi::CKnownFolderDefinition,class CTRefBase_NoModuleLifetimePolicy> >,class kfapi::CComparator<struct _GUID>,class kfapi::thro 不明
shell32.dll!kfapi::CFolderDefinitionCache::~CFolderDefinitionCache(void) 不明
shell32.dll!kfapi::CFolderDefinitionCache::Release(void) 不明
shell32.dll!SafeRelease<class kfapi::CFolderDefinitionCache>(class kfapi::CFolderDefinitionCache * *) 不明
shell32.dll!kfapi::CFolderCache::~CFolderCache(void) 不明
shell32.dll!kfapi::CFolderCache::Release(void) 不明
shell32.dll!kfapi::CKFFacade::Release(void) 不明
shell32.dll!kfapi::CKFFacade::s_Term(void) 不明
shell32.dll!_CleanupProcessAttachStuff(void) 不明
shell32.dll!_ProcessDetach(int) 不明
shell32.dll!_DllMain@12() 不明
shell32.dll!___CppXcptFilter() 不明
ntdll.dll!_LdrxCallInitRoutine@16() 不明
ntdll.dll!LdrpCallInitRoutine() 不明
ntdll.dll!LdrShutdownProcess() 不明
ntdll.dll!RtlExitUserProcess() 不明
kernel32.dll!_ExitProcessImplementation@4() 不明
ucrtbase.dll!_swprintf() 不明
ucrtbase.dll!_swprintf() 不明
ucrtbase.dll!_exit() 不明
デバッガをでデタッチしてから終了すればエラーにならないのですが、毎回でタッチするのは面倒ですね。
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク 星 睦美 2016年1月7日 0:36