Outlook 2010中的Outlook 2010无法使用

时间:2013-11-22 11:05:32

标签: visual-studio-2012 outlook-addin

我在Outlook 2010中创建了addin visual studio 2012。其中有一个上下文菜单和拖放区域。

我已经创建了它的安装程序文件。当我在具有outlook 2013的PC中安装它时,它无效。

如何创建可以在每个版本的Outlook上运行的Outlook版本独立添加。?

对此的任何帮助将不胜感激......!

3 个答案:

答案 0 :(得分:0)

大多数Office / Outlook 2013安装都是通过即点即用(C2R)而不是MSI完成的。 MSI是2010年及之前大多数安装的安装方法。

安装时,您的添加内容需要detect C2R and account for it

答案 1 :(得分:0)

根据微软的说法,

如果要开发Outlook 2010插件等,可以使用Visual Studio 2010或Visual Studio 2012。

如果要开发Outlook 2013插件等,则只能使用Visual Studio 2013。

http://msdn.microsoft.com/en-us/office/hh133430.aspx

答案 2 :(得分:0)

斯蒂芬温克勒是对的。我已经找到了我的添加方式可以在outlook 2010和2013上运行的方式。

我的加载项包含拖放区域和上下文菜单,正如我所提到的。我已经创建了Ribbon上下文菜单,它可以在两个outlook上工作。虽然我没有outlook 2007的源代码但仍有待测试。

对于拖放区域,有一个小小的变化,当我放弃Outlook 2013的邮件时,它们的大小比2010年的Outlook邮件更大。所以我有一个课程,我只是将邮件的转换类型更改为Int64,以便可以转换邮件。

以下是拖放区域的一些代码:

private void DragNDropArea_DragDrop(object sender, DragEventArgs e)
{
     //wrap standard IDataObject in OutlookDataObject
     OutlookDataObject dataObject = new OutlookDataObject(e.Data);

     //get the names and data streams of the files dropped
     string[] filenames = (string[])dataObject.GetData("FileGroupDescriptorW");
     MemoryStream[] filestreams = (MemoryStream[])dataObject.GetData("FileContents");

     for (int fileIndex = 0; fileIndex < filenames.Length; fileIndex++)
     {
         try
         {
             //use the fileindex to get the name and data stream
             string filename = filenames[fileIndex];
             MemoryStream filestream = filestreams[fileIndex];



             string startupPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);   

             if (Directory.Exists(startupPath))
             { }
             else
             {
                  Directory.CreateDirectory(startupPath);
             }

             //save the file stream using its name to the application path
             FileStream outputStream = File.Create(startupPath + "\\" + filename + ".msg");

             filestream.Seek(0, SeekOrigin.Begin);
             filestream.WriteTo(outputStream);

             outputStream.Close();
             filestream.Close();
             readMessage(filename, startupPath);
       }
       catch (System.Exception ex)
       {
            MessageBox.Show("Error Occured In getting Mail info..: \n" + ex.ToString());
       }
   }
}

OutlookDataObject.cs班级GetData()方法:

//create a new array to store file names in of the number of items in the file group descriptor
string[] fileNames = new string[fileGroupDescriptor.cItems];

//get the pointer to the first file descriptor
IntPtr fileDescriptorPointer = (IntPtr)((Int64)fileGroupDescriptorAPointer + Marshal.SizeOf(fileGroupDescriptorAPointer));
//loop for the number of files acording to the file group descriptor
for (int fileDescriptorIndex = 0; fileDescriptorIndex < fileGroupDescriptor.cItems; fileDescriptorIndex++)
{
    //marshal the pointer top the file descriptor as a FILEDESCRIPTORA struct and get the file name
    NativeMethods.FILEDESCRIPTORA fileDescriptor = (NativeMethods.FILEDESCRIPTORA)Marshal.PtrToStructure(fileDescriptorPointer, typeof(NativeMethods.FILEDESCRIPTORA));
    fileNames[fileDescriptorIndex] = fileDescriptor.cFileName;

    //move the file descriptor pointer to the next file descriptor
    fileDescriptorPointer = (IntPtr)((Int64)fileDescriptorPointer + Marshal.SizeOf(fileDescriptor));
 }

这就是我实现拖放邮件的方式。 对于上下文菜单:
Ribbon1.xml文件:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load" loadImage="GetImage">
  <contextMenus>
    <contextMenu idMso="ContextMenuMailItem">
      <button id="MyContextMenuMailItem" 
          label="OnePgr Integrator"
          onAction="OnMyButtonClick" showImage="true" image="favicon.ico.ico"/>
    </contextMenu>
    <contextMenu idMso="ContextMenuMultipleItems">
      <button id="MyContextMenuMultipleItems"
          label="OnePgr Integrator" image="favicon.ico.ico"
          onAction="OnMyButtonClick"/>
    </contextMenu>
  </contextMenus>
</customUI>

Ribbon1.cs类:

public void OnMyButtonClick(Office.IRibbonControl control)
{
     try
     {
          Outlook.Selection selectedMails = control.Context as Outlook.Selection;
     }
     catch (System.Exception ex)
     {
          MessageBox.Show(ex.ToString());
     }
}

从这个选择对象中,我可以获得同时适用于Outlook 2010和2013的MailItem。

谢谢大家的答案......!