none
windwos10で CreateInstance(L"Word.Application") をQuitすると暫くフリーズする 問題を回避したい

    質問

  • VisualStudio2010 C++MFCでソフトを開発しております。

    開発中のソフトのデータをWordファイルで出力しています。 ターゲットのWordは2010以降です。

    OSのターゲットは Win7/8.1/10 ですが、問題が発生しているのは ごく一部のWindows10だけです。 同じPCでもアカウントを追加したら起きなくなったという報告もあります。
    (因みに 2018/9位までの Windows10では問題が起きてませんでした。 これが起きるようになってUpdaterをいろいろアンインストールしても現状では解決していません)

    サンプルソースの wordApp->Quit() をコメントアウトすると、フリーズする事はないのですが、Wordのプロセスが残るようで、PCを再起動するとWordが自動で立ち上げます。
    wordApp->Quit() をコメントアウトしないと、数分ほどフリーズしますが、Wordのプロセスは残りません。

    フリーズしないで、Wordのプロセスが残らないようにしたいので、
    良い方法がありましたらご教授お願いします

    サンプル

    #import "??\microsoft shared\OFFICE14\mso.dll"     // フルパスは消しています
    #import "??\Microsoft Shared\VBA\VBA6\VBE6EXT.olb"
    #import "??\Microsoft Office\Office14\msword.olb"
    
    using namespace Word;
    
    void CTestApp::OnTest()
    {
    	Word::_ApplicationPtr  wordApp;
    	CComPtr<Word::_Document> wordDoc;
    	CComPtr<Documents> docs;
    
    
    	CoInitialize(NULL);
    	wordApp.CreateInstance(L"Word.Application");
    	wordApp->get_Documents(&docs);
    
    	// プログラムフォルダから Wordのテンプレートファイル template.dotx を読む
    	TCHAR Buffer[MAX_PATH];
    	DWORD dwRet;
    	dwRet = GetCurrentDirectory(MAX_PATH, Buffer);
    	CString csMessage = Buffer;
    	csMessage+=L"\\template.dotx";			// Home path + template name.
    		
    	int retVal = PathFileExists(csMessage);
    	if(retVal == 0)
    	{
    		exit(0);	
    	}
    
    	COleVariant tmpVariant( csMessage );
    	VARIANT variant = tmpVariant.Detach();
    	wordDoc = docs->Add(&variant);
    
    
    	CComPtr<Word::Range> pRange;
    	pRange = wordDoc->Range();
    
    	CString strTest = _T("0123456789");
    	pRange->Text = bstr_t( strTest );
    
        // C:tmpフォルダに test.docx を書き出します。
    	COleVariant objVariant( _T("c:\\tmp\\test.docx") );
    	variant = objVariant.Detach();
    	wordDoc->SaveAs(&variant);	
    	::VariantClear( &variant );
    	wordDoc->Close();
    	wordApp->Quit();	// ★これがあるかないかで挙動が変わる
    	CoUninitialize();
    }



    • 編集済み AppKey 2018年10月26日 8:26
    2018年10月26日 1:09

回答

  • その後

    ここ https://support.microsoft.com/ja-jp/help/822005/how-to-reset-user-options-and-registry-settings-in-word に Wordのレジストリを修復するプログラムがありました。

    このページの ここで簡単に解決する とあるプログラムをダウンロードして動かしたら、問題が起きなくなりました。

    お客さんが何をやってこの状態になったか予想する事は難しいので、とりあえずこうゆう事をあったらこれを使ってください という事で収めようと思います。

    少し間を開けて テストを3回程行い、問題が解消する事を確認できれば本件は閉じます。

    その後2

    エンドユーザーのPCでは上記Wordのレジストリを修復を行っても問題が回避できない事が判りましたが、Officeをインストールし直したら問題が起きなくなったようなので、これで本件はとじます。

    みなさんありがとうございました。

    • 編集済み AppKey 2018年10月31日 12:33
    • 回答としてマーク AppKey 2018年10月31日 12:33
    2018年10月28日 5:27

すべての返信

  • とりあえず "Application Verifier" を使って、その問題状態をエラーとして検出できているかを確認してみては?
    ---------------------------------------
    Windows SDK ツール:Application Verifier のご紹介
    https://blogs.msdn.microsoft.com/japan_platform_sdkwindows_sdk_support_team_blog/2011/05/29/windows-sdk-application-verifier/
    ---------------------------------------

    "Application Verifier" でその問題状態を検出できるなら、あとはデバッガをアタッチさせて、その時のプロセス/スレッド状態を調べれば原因を特定できると思います。
    2018年10月26日 1:29
  • ありがとうございます。

    Application Verifier は知らなかったので、調べて使ってみます。

    問題が起きているのはお客さんのPCの一部のアカウントだけで、 自分のPC(Windows10 3台)ではおきていません。

    お客さんのPCのそのアカウントに開発環境をいれる事はできないので、デバッグは難しいですね。 ただApplication Verifierだけは入れて挙動を見たいと思います。


    2018年10月26日 1:48
  • > お客さんのPCのそのアカウントに開発環境をいれる事はできないので、
    > デバッグは難しいですね。

    WinDBG なら、USB メモリ上からも起動できる。

    それ以外の方法としては。。。。
    "Application Verifier" で検出できるなら、WER (Windows Error Reporting) でも検出できる可能性が高いので、下記サイトを参考にお客様環境に WER レジストリ設定をしておくことをお勧めします。

    ---------------------------------------
    Windows エラー報告 (Windows Error Reporting, WER) を使ってユーザーモードプロセスダンプを取得する方法を知りたい。
    https://support.symantec.com/ja_JP/article.TECH233988.html
    ---------------------------------------

    上記設定をしておくと、WER がエラーを検出したタイミングで、そのプロセスの「プロセス ダンプ」を生成してくれます。
    そのプロセス ダンプが、"Application Verifier" で検出したエラーと同じタイミングなら、そのダンプを解析すればライブ デバッグと同等の調査ができる。

    ところで。。。。
    「AppKey さん」と「Freeプログラマー さん」って、同一人物?
    2018年10月26日 2:35
  • 情報ありがとうございます。

    一緒に開発している仲間ですが、アカウントを変えるのを忘れてました。 失礼しました。

    2018年10月26日 3:08
  • Application Verifier でテストしてみました。

    ソフトはフリーズしますが、Application Verifier-Logsで見た限り ErrorもWarningも出てないようです。

    AppVerifierLogsフォルダにはバイナリの.datファイルがでてました。

    このファイルの内容を見たいのですが、見る方法を教えていただけますでしょうか?

    よろしくお願い致します。

    2018年10月26日 6:47
  • 回答ではなく質問ですが、フリーズとは具体的にどのような現象でしょうか?動作停止(アプリケーションが落ちる)になるのか、しばらく応答なしになるのか(しばらくするとアプリは正常終了する)のかなど。また、何らかのエラーメッセージ等は表示されますか?

    該当の Quit() の前にいろいろと処理を行っていますが、例えば SaveAs を行わないなど、処理を省いていったときに、現象は発生しなくなったりするのでしょうか?

    2018年10月26日 7:02
  • Resありがとうございます。

    これです。 > しばらく応答なしになるのか(しばらくするとアプリは正常終了する)  暫くは2~3分です。

    プログラムの中で応答なしになる訳ではなく、プログラムは最後まで流れて処理がOSに戻ってから応答なしになります。

    エラーメッセージなどは表示しません。 

    wordApp->Quit() これもエラーにはなってませんでした。

    慣れないApplication Verifierに時間を使いました。 これからいろいろ省く処理を行う予定です。 

    また何か進展がありましたらアップします。

    2018年10月26日 7:59
  • wordDoc->SaveAs(&variant) だけコメントアウト
    wordDoc->Close() だけコメントアウト
    両方フリーズしました。

    ただこの2つをコメントアウトするとフリーズしませんでした。

    wordDoc->SaveAs / wordDoc->Close / wordApp->Quit 
    はどれも省けないのでプログラム的には手づまりの感があります。

    一部のPCの一部のアカウントだけ発生しているので、そのあたり何かを更新/削除などで回避出来れば良いんですが。

    • 編集済み AppKey 2018年10月26日 9:27
    2018年10月26日 9:25
  • > ソフトはフリーズしますが、Application Verifier-Logsで見た限り ErrorもWarningも出てないようです。
    > AppVerifierLogsフォルダにはバイナリの.datファイルがでてました。
    > このファイルの内容を見たいのですが、見る方法を教えていただけますでしょうか?

    そのログには、どんな情報が記録されていたのですか?
    また検証するオプションには、何を設定しているのでしょうか?
    先に提示した Blog でも説明されていますが、"AppVerif" はエラーを検出するとデバッガに Break-in してくれます。
    (Break-in させない設定にもできるけど、Default は Break-in する設定。)
    なのでデバッガに落ちない (Break-in しない) のであれば "AppVerif" はエラーを検出していないので、ログみても意味が無いと思います。
    それでも dat ファイルの中身を見たいのであれば。。。
    ------------------------------------
    [application verifier] 使用方法
    http://hisakawa-jp.blogspot.com/2016/02/application-verifier.html
    ------------------------------------

    "AppVerif" や "WER" でエラーを検出できないのであれば。。。。
    あとは Task Manager で現象発生時のプロセス ダンプを採取してそれを解析する。。。とか。
    特定の PC 環境でしか起きていないのであれば、その PC にインストールされている 3rd ベンダー製サービス等の影響も考えられるので、クリーンブート設定でどーなるか検証するとか。
    (クリーンブート設定で起きないなら、この問題は 3rd ベンダー製サービスが Injection している DLL の影響なので、あとはそのサービスを特定すればいい。)
    2018年10月26日 9:26
  • うーん。template.dotx の内容によって現象が変わったりしますか?空にしてみるとか、あるいはセキュリティソフトが動いているとかはどうでしょうか?
    2018年10月26日 13:13
  • 念のため確認ですが、CoInitialize()がエラーを返していたりしませんか?

    # CoInitializeEx(nullptr, COINIT_MULTITHREADED)実行済みでCoInitialize()がRPC_E_CHANGED_MODEを返すパターン。

    2018年10月26日 14:15
  • みなさまいろいろ考えて頂いてありがとうございました。

    template.dotxは空にしても、 template.dotxを使わないでもダメでした。

    セキュリティーソフトはウイルスバスターが入ってます。 機能を停止にしても問題は発生しました。

    CoInitialize()は0を返してました。

    クリーンブートでは、Microsoftのサービス以外を全て無効にして、スタートアップもほとんど何もやらない状況でも問題が発生しました。 Microsoftのサービスも全部無効にすると Officeが全部使えないので、この先は掘り下げてません。

    現状発生しているPCでは、管理者で発生して、それ以外のアカウントでは問題が発生しないので、明日はそのあたりの違いから調べて行こうと思っています。


    • 編集済み AppKey 2018年10月27日 3:41
    2018年10月26日 15:08
  • 途中経過です。

    同じPCの同じOS内でもアカウントが違うと問題が発生しないので

    問題が起きないアカウントの レジストリデータ(HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Word)を問題が起きていたアカウントのレジストリに持ってきたら問題が起きなくなりました。

    しかし、問題が起きていたアカウントのレジストリで 16.0\Wordを全部削除して、問題が起きないレジストリデータからWordの下位キーを1つずつインポートしても問題が解消する事はなかったです。(ただこの場合、フリーズしてから処理が戻ってくるのが少し短くなった感じがあります)

    レジストリーのあるキーをインポートすると、それとは別にキーが出来たりしているので、 Wordのデータを丸ごとインポートした時、これとは違うどこかの値が変わっているかもしれません。それがどこか判ればいいんですが。

     
    • 編集済み AppKey 2018年10月28日 3:59
    2018年10月28日 3:34
  • その後

    ここ https://support.microsoft.com/ja-jp/help/822005/how-to-reset-user-options-and-registry-settings-in-word に Wordのレジストリを修復するプログラムがありました。

    このページの ここで簡単に解決する とあるプログラムをダウンロードして動かしたら、問題が起きなくなりました。

    お客さんが何をやってこの状態になったか予想する事は難しいので、とりあえずこうゆう事をあったらこれを使ってください という事で収めようと思います。

    少し間を開けて テストを3回程行い、問題が解消する事を確認できれば本件は閉じます。

    その後2

    エンドユーザーのPCでは上記Wordのレジストリを修復を行っても問題が回避できない事が判りましたが、Officeをインストールし直したら問題が起きなくなったようなので、これで本件はとじます。

    みなさんありがとうございました。

    • 編集済み AppKey 2018年10月31日 12:33
    • 回答としてマーク AppKey 2018年10月31日 12:33
    2018年10月28日 5:27