数週間前から、少数のお客様で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がアドインを無効にすることができますか?
いくつかの詳細/観察:
OutputDebugString
メッセージをinitialization
セクションに配置しました(これはDelphi DLLです)。アドインのロードに失敗した場合、それらはいずれも表示されません。この問題の影響を受けるのはごく一部のお客様のみです。数万のインストールがあり、これに関するレポートはありません。
UPDATE:アドインがアンロードされる前にログに記録される最後のものの1つは、「OLEエラー」というテキストの例外であることが多いようです(常にではありません)。 800A01A8 "。その例外は、私が使用しているフレームワークに組み込まれているグローバル例外ハンドラー( Add-in-Express )によってキャッチされ、すべてのメソッドが現在使用されている独自のコードのどこからも発生していないようです。完全にtry..catch
でラップされています。これは通常、インスペクターのActivateイベントハンドラーからCommandBarButtonsの可視性を設定した直後に発生します。
影響を受けるすべてのマシンに共通のプロパティ:
おそらく同様に重要であることに注意するもう1つのこと(私が最初に思ったほどではないかもしれませんが):
コンパイルされたDLLを「シェル」にラップし、オンザフライでのみ解凍する、サードパーティベンダーのライセンス/コピー防止モジュールを使用しています。独自のコードが実行される前にアドインがアンロードされることがわかったので、これが私の主な疑いです。ただし、ベンダーは、コードに未処理の例外がある可能性があることを確認しましたが、の特別なデバッグバージョンによって生成されたログファイル保護シェルは、解凍プロセスが正常に完了し、Outlookがアドインをアンロードする前に制御が保護されたDLLに既に戻されていることを示しました。したがって、Outlookがアドインをアンロードする原因はすべて完了の間に発生するようです。保護シェルの初期化と独自のコードの.
これ以上のアイデアはありますか?
これを閉じるために:問題は最終的に、使用していたサードパーティのライセンスラッパーのバグが原因であることが判明しました。これはベンダーによって確認されており、最近のリリースで修正されています。
私の会社は、あなたが何年も見ているのと同じ問題のように聞こえるものに我慢してきました。私たちが持っているプラグインは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アドインとも相互作用しません。また、コピー防止アプリも使用していません。
申し訳ありませんが、これ以上お役に立てることはありませんが、根本的な原因になりたいと思います。
多分あなたはロックバックポリシーの犠牲者です。レジストリにバイパスキーを追加すると、機能します。最新の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);
}
}
Outlookアドインにも取り組んでおり、アドインが無効になる理由の1つを知っています。 Outlookが突然シャットダウンしたり、ユーザーがOutlookを強制的にシャットダウンしたりすると、アドインが無効になります。これがあなたの場合の理由であるかどうかはわかりませんが、それはあなたに考える方向性を与えることもできます。この動作をシミュレートするために、この方法(タスクマネージャーを使用してOutlookを閉じる)を使用してこの動作をシミュレートすることがあります。実際には、提供されているすべてのマシンをスキャンし、マシンでアドインが無効になっているかどうかを確認するツールを開発しました。はいの場合、レジストリ値を変更して有効にします。
ユーザーがデバッグプログラムを実行して、問題が発生したときに問題に関する詳細情報を取得できる場合は、Microsoftのアドインスパイを使用してみてください。
http://msdn.Microsoft.com/en-us/library/cc984533(v = office.12).aspx
アドインの読み込みに失敗していましたが、依存関係がプリロードされていないために発生していることがわかりました。このツールは、Outlookアドインの読み込みに失敗したときに発生している特定のエラーを通知できるはずです。