1

我正在尝试编写一个 Outlook 2007 VSTO 加载项,它可以让您使用 Sharepoint Web 服务做一些事情。我真的很想让用户尽可能简单;理想情况下,他们所要做的就是将 Sharepoint 列表连接到 Outlook。从那里,我的加载项理想情况下会从列表中获取实际的 Sharepoint URL 并执行它的操作。不幸的是,我似乎无法找到 Outlook 在运行时存储此信息的位置。

我能找到的最佳解决方案是读取 C:\Documents and Settings(username)\Local Settings\Application Data\Microsoft\Outlook*.sharing.xml.obi 中的文件。

但是,这些文件仅在您关闭 Outlook 时才会更新。这意味着用户必须连接到列表,重新启动 Outlook,然后一切正常。我宁愿事情没有达到那个水平。

这几乎就像信息只是魔法般地进入了sharing.xml.obi 文件。我用谷歌搜索过,我用过 OutlookSpy,绝望中我用过 mfcmapi.exe,但都无济于事。Outlook 到底在哪里存储这个?

4

3 回答 3

2

您可以使用对象模型(或直接 MAPI 调用)从 Outlook 文件夹中查询此信息。首先使用 .isSharePointFolder 属性来定位您的文件夹。然后将 Outlook 中 SharePoint 列表的 URL 作为“隐藏”消息的主题存储在关联的内容表中。

额外提示:如果您还没有使用它,请获取一份出色的OutlookSpy副本。它使弄清楚这种东西变得容易得多。

于 2009-07-15T19:51:36.540 回答
1

有了 Paul-Jan 的指针,我已经明白了这一点。因为我讨厌在谷歌搜索时只找到间接提示,所以这正是您需要的代码:

    private string getSharepointURL(Microsoft.Office.Interop.Outlook.Folder SharepointFolder)
    {
        if (!SharepointFolder.IsSharePointFolder)
            throw new Exception("Cannot get the SharePoint URL of " + SharepointFolder.FullFolderPath + ", because it is not a SharePoint folder.");
        return (string)((object[])SharepointFolder.GetTable("", 1).FindRow("[From] = SharePoint").GetValues())[1];
    }

这可能是我写过的最丑陋的回报声明。这是它的作用:

  1. 调用 Outlook.Folder.GetTable("",1)。第一个参数是一个过滤器,意思是“任何东西”,第二个参数相当于olHiddenItems。(我找不到实际的枚举)
  2. 获取该表的下一行,其发件人([From] 字段)为“SharePoint”。我们想要的信息总是保存在这个隐藏的信息中。
  3. 获取该隐藏消息的值。这作为一个对象返回,但秘密地是一个对象[]。
  4. 将值强制转换为 object[]。
  5. 获取值的第二项,即 url。
  6. 将 url 转换为字符串。

幸运的是,您可以在 OutlookSpy 中自己完成所有这些步骤。这对弄清楚如何获取这些宝贵的信息很有帮助。

于 2009-07-16T16:35:10.263 回答
0

好吧,这就是我使用的... (C#3/VS2008, Outlook2007)

Outlook.Folder folder = GetSomeSpFolder(); // requirement :)

// Things to look for here, not in the columns by default
// the values can be found in OutlookSpy or perhaps MSDN (haha)
// this value refers to the SP site (not the full URL)
var SHARING_REMOTE_STORE_UID = "http://schemas.microsoft.com/mapi/id/{00062040-0000-0000-C000-000000000046}/8A48001E";

var table = folder.GetTable("[From] = SharePoint", Outlook.OlTableContents.olHiddenItems);
// setup columns to look through
table.Columns.RemoveAll();
table.Columns.Add(SHARING_REMOTE_STORE_UID);
if (!table.EndOfTable) {
  var row = table.GetNextRow();
  var siteURL = row[SHARING_REMOTE_STORE_UID];
  Marshal.ReleaseComObject(row);
} else {
  // No matching entry ...
}
Marshal.ReleaseComObject(table);

另请查看http://msdn.microsoft.com/en-us/library/bb176406.aspx

快乐编码!

于 2009-10-14T08:03:15.890 回答