我在Outlook 2010
中创建了addin
visual studio 2012
。其中有一个上下文菜单和拖放区域。
我已经创建了它的安装程序文件。当我在具有outlook 2013
的PC中安装它时,它无效。
如何创建可以在每个版本的Outlook上运行的Outlook版本独立添加。?
对此的任何帮助将不胜感激......!
答案 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。
答案 2 :(得分:0)
我的加载项包含拖放区域和上下文菜单,正如我所提到的。我已经创建了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。
谢谢大家的答案......!