从剪贴板获取多个Outlook附件

时间:2012-06-14 20:39:20

标签: c++ outlook clipboard ole idataobject

我正在尝试从剪贴板中获取多个 Outlook个附件。

当用户选择多个附件并将其放入剪贴板(或拖动)时,正在创建IDataObject并将其放置在剪贴板中。

我知道可以使用包含虚拟对象名称的IDataObjectCLIPFORMAT CFSTR_FILEDESCRIPTOR中找到文件名。另外,据我所知,我使用CLIPFORMAT CFSTR_FILECONTENTS收到文件内容。但是当我这样做时,我只得到一个文件,而且我不明白如何获取已复制到剪贴板的其他文件。

我发现使用lindex中的FORMATETC成员我可以获取其他文件,但由于某种原因它无效。

任何人都可以解释或举例说明如何获取其他附件(更喜欢C ++ )?

1 个答案:

答案 0 :(得分:0)

看看CodeProject Outlook Drag-n-Drop example。它在包装类IDataObject中使用OutlookDataObject,但它与剪贴板使用的界面相同。在C#中,您可以执行以下操作...

// IDataObject wrapper
OutlookDataObject dataObject = new OutlookDataObject(Clipboard.GetDataObject());

// retrieving filenames
string[] filenames = (string[])dataObject.GetData("FileGroupDescriptorW");
this.label1.Text = "filenames:\n    " + string.Join(",", filenames) + "\n";

// writing out file contents
MemoryStream[] filestreams = (MemoryStream[])dataObject.GetData("FileContents");

this.label1.Text += "Files:\n";
for (int fileIndex = 0; fileIndex < filenames.Length; fileIndex++)
{
    //use the fileindex to get the name and data stream
    string filename = filenames[fileIndex];
    MemoryStream filestream = filestreams[fileIndex];
    this.label1.Text += "    " + filename + "\n";

    //save the file stream using its name to the application path
    FileStream outputStream = File.Create(filename);
    filestream.WriteTo(outputStream);
    outputStream.Close();
}

查看OutlookDataObject包装器类,您应该能够在C ++中实现类似的东西。