web-dev-qa-db-ja.com

未処理の例外を除いて、OutlookがCOMアドインの読み込み動作を2に変更する原因は何ですか?

数週間前から、少数のお客様でOutlookアドインがアンロードされ、まだ不明な理由で無効になっているという問題に取り組んできました。 「無効」とは、Outlookが次のレジストリ値を3から2に変更することを意味します。これは、事実上、次回の起動時にアドインが読み込まれないことを意味します。

HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Outlook\Addins\[OurAddin.sProgID]\LoadBehavior

エラーメッセージはなく、アドインが生成するログファイルにも例外は表示されません。

LoadBehaviorの変更の問題を具体的に扱っている次のページをすでに見つけました: http://blogs.msdn.com/vsod/archive/2008/04/22/Troubleshooting-com-add-in-load- failed.aspx

ただし、そこで提案されている考えられる理由はどれも当てはまらないようです。

  • アドインは、単に無効アイテムリストにリストされているだけではありません。
  • IDTExtensibility2メソッドにも、コードの他の場所にも、未処理の例外はありません。すべてのコードは同等のtry/catchでラップされ、すべての例外出力はOutputDebugStringまたはログファイルにのみ出力されます。
  • このエラーは、ウイルス対策ソフトウェアとは無関係のようです。つまり、エラーは無効にした場合にも発生します。
  • 他のすべてのアドインを無効にしても、エラーには影響しません。

では、他に何が原因でOutlookがアドインを無効にすることができますか?

いくつかの詳細/観察:

  • これまでのところ、テスト環境で問題を再現することはできなかったため、問題が発生している間はデバッガーをアタッチできませんでした。
  • リモートサポート(TeamViewer)を介して何が起こるかを監視しようとしている間は、この問題は発生しません。これは、TeamViewerがフックDLLを使用して、実行中のすべてのプロセス(Outlookを含む)に自身を挿入し、メモリレイアウト、タイミング、スレッドの順序などに影響を与えるためだと思います。
  • アドインの新しいバージョンをコンパイルして新しいことを試すときはいつでも、アドインは通常、数時間または数日間は正常に動作し、最終的には再び無効になります。これが発生すると、別のビルドをコンパイルしてデプロイするまで(または、LoadBehaviorの値を手動で元に戻すことにより)、そのマシンにアドインをロードするための後続のすべての試行は失敗します( TeamViewer-上記を参照)。
  • 通常、アドインはOutlookの起動時にアンロードされますが、Outlookが既にしばらく実行された後にもアンロードされる場合があります。このような場合のログファイルは完全に目立たないように見えます。アドインは、Outlookが正常に閉じられたかのように、通常のシャットダウン手順を実行するだけです。
  • ログファイルから、SysInternals ProcessMonitorを介して問題を観察することでわかる限り、Outlookの起動時に(セッション中ではなく)アドインが無効になると、DLLは、 COMオブジェクト(つまり、アドイン)がインスタンス化されます(コンストラクターのログメッセージが表示されることはありません)。
  • OutputDebugStringメッセージをinitializationセクションに配置しました(これはDelphi DLLです)。アドインのロードに失敗した場合、それらはいずれも表示されません。
  • この問題の影響を受けるのはごく一部のお客様のみです。数万のインストールがあり、これに関するレポートはありません。

  • UPDATE:アドインがアンロードされる前にログに記録される最後のものの1つは、「OLEエラー」というテキストの例外であることが多いようです(常にではありません)。 800A01A8 "。その例外は、私が使用しているフレームワークに組み込まれているグローバル例外ハンドラー( Add-in-Express )によってキャッチされ、すべてのメソッドが現在使用されている独自のコードのどこからも発生していないようです。完全にtry..catchでラップされています。これは通常、インスペクターのActivateイベントハンドラーからCommandBarButtonsの可視性を設定した直後に発生します。

影響を受けるすべてのマシンに共通のプロパティ:

  • Windows XP Professional、最新のパッチレベル
  • Outlook 2003 Professional、最新のパッチレベル
  • mcAfee Virus Scanのさまざまなバージョン(無効にしても効果はありません-上記を参照)
  • ユーザーはローカルのAdministratorsグループのメンバーです

おそらく同様に重要であることに注意するもう1つのこと(私が最初に思ったほどではないかもしれませんが):
コンパイルされたDLLを「シェル」にラップし、オンザフライでのみ解凍する、サードパーティベンダーのライセンス/コピー防止モジュールを使用しています。独自のコードが実行される前にアドインがアンロードされることがわかったので、これが私の主な疑いです。ただし、ベンダーは、コードに未処理の例外がある可能性があることを確認しましたが、の特別なデバッグバージョンによって生成されたログファイル保護シェルは、解凍プロセスが正常に完了し、Outlookがアドインをアンロードする前に制御が保護されたDLLに既に戻されていることを示しました。したがって、Outlookがアドインをアンロードする原因はすべて完了の間に発生するようです。保護シェルの初期化と独自のコードの.

これ以上のアイデアはありますか?

18
Oliver Giesen

これを閉じるために:問題は最終的に、使用していたサードパーティのライセンスラッパーのバグが原因であることが判明しました。これはベンダーによって確認されており、最近のリリースで修正されています。

2
Oliver Giesen

私の会社は、あなたが何年も見ているのと同じ問題のように聞こえるものに我慢してきました。私たちが持っているプラ​​グインはOutlook2003用のVB6COMアドインであり、1日に数百回(数千回ではないにしても)循環する数百台のマシンにデプロイされています。ロードとアンロードのサイクルを何度も繰り返します。

プラグインがロードされているが接続されていない場合、一般的なエラーがかなり発生し、コードで処理します。 (明らかに生産品質ではありません)

Dim Outlook As Outlook.Application
Set Outlook = CreateObject("Outlook.Application")
Outlook.COMAddIns("MyFancyDancyPlugin").Connect = True

まれですが、煩わしくないほどまれではありませんが、プラグインがロードされた状態に達し、「ツール>オプション>その他>詳細オプション> Comアドイン」で確認できますが、物事に接続することはできません。接続しようとしてもエラーは発生せず、切断された状態に戻ります。 [レジストリキーで2に戻すのと同じです]私が知る限り、COMオブジェクトは作成されません。アイテムは無効アイテムにリストされていません。

このエラーを修正するために実際に再デプロイする必要はありません。 Com Add-Insダイアログでオブジェクトを削除してから再度追加すると、問題が修正されたようです。これはまだ許容できる解決策ではありませんが、再インストールせずに元に戻して実行できます。

  • Windows XP Professional、最新のパッチレベル
  • Outlook 2003 Professional、最新のパッチレベル
  • mcAfee Virus Scanのさまざまなバージョン(無効にしても効果はありません-上記を参照)
  • ユーザーはローカルのAdministratorsグループのメンバーです

これは適切なようです。McAfeeは使用していませんが、ウイルススキャナーはOutlookやcomアドインとも相互作用しません。また、コピー防止アプリも使用していません。

申し訳ありませんが、これ以上お役に立てることはありませんが、根本的な原因になりたいと思います。

5
Dan Blair

多分あなたはロックバックポリシーの犠牲者です。レジストリにバイパスキーを追加すると、機能します。最新のOfficeバージョンまたはvstoは、インストール中にキーを作成します。その効果は次のとおりです。最新のオフィスもインストールすると、adddinも古いオフィスに読み込まれます。ご覧ください

netOfficeから取得したコードスニペット http://netoffice.codeplex.com

public static void RegisterFunction(Type type)
{
            try
            {
                // add codebase value
                Assembly thisAssembly = Assembly.GetAssembly(typeof(ExampleClassicAddin));
                RegistryKey key = Registry.ClassesRoot.CreateSubKey("CLSID\\{" + type.GUID.ToString().ToUpper() + "}\\InprocServer32\\1.0.0.0");
                key.SetValue("CodeBase", thisAssembly.CodeBase);
                key.Close();

                key = Registry.ClassesRoot.CreateSubKey("CLSID\\{" + type.GUID.ToString().ToUpper() + "}\\InprocServer32");
                key.SetValue("CodeBase", thisAssembly.CodeBase);
                key.Close();

                // add bypass key
                // http://support.Microsoft.com/kb/948461
                key = Registry.ClassesRoot.CreateSubKey("Interface\\{000C0601-0000-0000-C000-000000000046}");
                string defaultValue = key.GetValue("") as string;
                if (null == defaultValue)
                    key.SetValue("", "Office .NET Framework Lockback Bypass Key");
                key.Close();

                // add addin key
                Registry.ClassesRoot.CreateSubKey(@"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable");
                Registry.CurrentUser.CreateSubKey(_addinRegistryKey + _prodId);
                RegistryKey rk = Registry.CurrentUser.OpenSubKey(_addinRegistryKey + _prodId, true);
                rk.SetValue("LoadBehavior", Convert.ToInt32(3));
                rk.SetValue("FriendlyName", _addinName);
                rk.SetValue("Description", "NetOffice COMAddinExample with classic UI");
                rk.Close();
            }
            catch (Exception ex)
            {
                string details = string.Format("{1}{1}Details:{1}{1}{0}", ex.Message, Environment.NewLine);
                MessageBox.Show("An error occured." + details, "Register " + _addinName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
}
2
Homero

Outlookアドインにも取り組んでおり、アドインが無効になる理由の1つを知っています。 Outlookが突然シャットダウンしたり、ユーザーがOutlookを強制的にシャットダウンしたりすると、アドインが無効になります。これがあなたの場合の理由であるかどうかはわかりませんが、それはあなたに考える方向性を与えることもできます。この動作をシミュレートするために、この方法(タスクマネージャーを使用してOutlookを閉じる)を使用してこの動作をシミュレートすることがあります。実際には、提供されているすべてのマシンをスキャンし、マシンでアドインが無効になっているかどうかを確認するツールを開発しました。はいの場合、レジストリ値を変更して有効にします。

2
Kapil

ユーザーがデバッグプログラムを実行して、問題が発生したときに問題に関する詳細情報を取得できる場合は、Microsoftのアドインスパイを使用してみてください。

http://msdn.Microsoft.com/en-us/library/cc984533(v = office.12).aspx

アドインの読み込みに失敗していましたが、依存関係がプリロードされていないために発生していることがわかりました。このツールは、Outlookアドインの読み込みに失敗したときに発生している特定のエラーを通知できるはずです。

2
Aaron