18

数週間前から、少数のお客様で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-failures.aspx

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

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

では、他に何が原因でOutlookがアドインを無効にする可能性がありますか?

いくつかの詳細/観察:

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

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

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

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

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

他にアイデアはありますか?

4

5 に答える 5

5

私の会社は、あなたが何年も見ているのと同じ問題のように聞こえるものに我慢してきました。私たちが持っているプラ​​グインは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グループのメンバーです

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

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

于 2009-05-20T15:34:10.853 に答える
2

たぶん、あなたはロックバック ポリシーの被害者です。バイパスキーをレジストリに追加すると、機能します。最新のオフィス バージョンまたは vsto は、インストール中にキーを作成します。その効果は次のとおりです。最新のオフィスもインストールすると、アドインが古いオフィスにもロードされます。見てください

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);
            }
}
于 2011-05-31T02:35:13.340 に答える
2

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

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

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

于 2011-08-16T18:35:34.297 に答える
2

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

于 2012-02-03T10:24:58.013 に答える