埋め込み Outlook ビュー コントロール
-
02-07-2019 - |
質問
Windows XP SP3 および Internet Explorer 7 上の Visual Studio 2008 を使用して Outlook 2003 アドインを作成しようとしています。
私のアドインは、Outlook ビュー コントロールをラップするカスタム フォームを表示するカスタム フォルダー ホーム ページを使用しています。
「HRESULT からの例外」で COM 例外が発生します。OVC のフォルダー プロパティを設定しようとすると、毎回 0xXXXXXXXX という説明が表示されます。エラーコードは乱数であり、毎回異なります。これはコントロールのプロパティへの最初のアクセスではありません。その前に、View プロパティと ViewXML プロパティはすでに設定されています。コントロールはスクリプトを実行しても安全であるとマークされています。
私はアクティブなエクスプローラーの CurrentFolder.FolderPath プロパティの値を使用していますが、これは正しいようです。
Outlook.Explorer currentExplorer = app.ActiveExplorer();
if (currentExplorer != null)
{
ovcWrapper.Folder = currentExplorer.CurrentFolder.FolderPath;
}
これはスタック トレースの先頭です。
System.Runtime.InteropServices.COMException (0xXXXXXXXX): Exception from HRESULT: 0xXXXXXXXX
at Microsoft.Office.Interop.OutlookViewCtl.ViewCtlClass.set_Folder(String pVal)
at AxMicrosoft.Office.Interop.OutlookViewCtl.AxViewCtl.set_Folder(String value)..
これは、フォルダーがデフォルト以外の PST ファイルにある場合にのみ発生します。デフォルトの PST ファイル内のフォルダーに変更しても、例外は発生しません。
休暇に行く前にすべてがうまく機能したことを強調しなければなりません:)。私の不在中に、Windows XP が Internet Explorer または Outlook 2003 のデフォルトのセキュリティを変更する更新プログラムをインストールしたようです。
もう一方 (仮想マシン) では、Office 2007 と Internet Explorer 6 を使用しており、更新を行わなくても、すべてが正常に動作しています。
解決
しばらくして、最終的に解決策が何であるかがわかりました。外部ストレージの名前を新しい名前に変更します。
アドインの起動中に、デフォルト以外の PST ファイルが読み込まれ、その名前 (pst ファイルの名前ではなく、ルート フォルダーの名前) が「Documents」に変更されます。
これはコードです:
session.AddStore("C:\\test.pst"); // loads existing or creates a new one, if there is none.
storage = session.Folders.GetLast(); // grabs root folder of the new fileStorage.
if (storage.Name != storageName) // if fileStorage is brand new, it has default name.
{
storage.Name = "Documents";
session.RemoveStore(storage); // to apply new fileStorage name, it have to be removed and added again.
session.AddStore(storagePath);
}
解決策は、「Documents」という名前をもう使用するのではなく、何か新しい名前を使用することです。問題は特定の名前とは関係ありません。
他のヒント
ドブリ・ダン、ネンシー :)
ここにある情報を踏まえて本当に「特効薬」の解決策を提供できるかどうかはわかりませんが、試してみるいくつかのアイデア/メモを以下に示します。
過去にいくつかのプロジェクトで Outlook を使用したことがありますが、外部のユーザーやプロセスにアクセスを許可することに関しては、Outlook は時々おかしな鳥であると言えます。場合によっては、ユーザーがアクセスまたはログインを手動で確認する必要があるため、
app.Session.Logon()
どこかでお世話になりました。
私が気づいたもう一つのことは、 app.ActiveExplorer()
この関数が想定どおりの値を返していることを確認してください。それには、 一番上の ユーザーのデスクトップ上のウィンドウ...これが通常です しかしいつもではない 作業しようとしているウィンドウなので、もう一度確認してください。