【问题标题】:Accessing "Mapi32.dll" with C#使用 C# 访问“Mapi32.dll”
【发布时间】:2011-02-16 07:28:57
【问题描述】:

我正在使用 VS 2008 C# Windows 应用程序。

我正在尝试使用此 DLL 导入。

[DllImport("Mapi32.dll", PreserveSig = true)]
private static extern void
WrapCompressedRTFStream(
[MarshalAs(UnmanagedType.Interface)]
UCOMIStream lpCompressedRTFStream,
uint ulflags,
[MarshalAs(UnmanagedType.Interface)]
out UCOMIStream lpUncompressedRTFStream
);

public const uint MAPI_MODIFY = 0x00000001;
public const uint STORE_UNCOMPRESSED_RTF = 0x00008000;

我有一个 CompressedRFTFormat 格式的压缩字符串。

如何将字符串传递到 WrapCompressedRTFStream?我不明白该方法的预期内容。

我正在尝试在按钮上使用它。

RichText1.text = WrapCompressedRTFStream(_CompressedRichText.ToString(),something,somethingelse);

我得到的第一个错误是“无法从 'string' 转换为 'System.Runtime.InteropServices.UCOMIStream”

希望了解这篇文章的人能给出帮助的答案!

好的,所以当我使用 IStream 时,我最终会遇到同样的情况。

[DllImport("Msmapi32.dll", PreserveSig = true)]
private static extern void WrapCompressedRTFStream(
[MarshalAs(UnmanagedType.Interface)]
    IStream lpCompressedRTFStream,
uint ulflags,
[MarshalAs(UnmanagedType.Interface)]
    out IStream lpUncompressedRTFStream
);

这里真正的问题是我不明白什么/如何处理这个方法的输入和输出。

【问题讨论】:

  • 不知道压缩算法就无法解压
  • 是microsoft outlook压缩的RichText格式。
  • @Midhat:这就是这个函数的重点。查看 in 和 out 参数。
  • 我正在查看 in 和 out 参数,这就是我遇到问题的地方。请注意:如何将字符串传递到 WrapCompressedRTFStream?我不明白该方法的期望是什么。
  • 您找到解决方案了吗?我正在尝试做同样的事情......

标签: c# c++ dllimport istream


【解决方案1】:

我认为使用旧的本机代码库不是一个好主意,我会花更多时间在 .net 中找到类似的代码

尝试 com interopp-invoke .net 技术以使用旧代码。

【讨论】:

  • 我尝试将它与 com 互操作一起使用,但我无法让它工作。查看链接上的代码,您能帮我将它与互操作一起使用吗? (此时我不想学习 C++。) 至于 .net 中的类比代码。我还没有找到。
  • 这篇文章可能会有所帮助:c-sharpcorner.com/uploadfile/rambab/…
【解决方案2】:

如果您找不到用于执行此操作的本机 .NET 方法,一个好的方法是将您的方法包含在托管 C++ 包装器中。

这将让您创建 C++ 代码来执行您的工作,同时公开一个托管类来调用该方法。这可能会更复杂,因为它需要您学习托管 C++,但允许您执行任何必要的 C++ 工作,返回包含“答案”的 .NET 字符串。

【讨论】:

  • 好吧,那太好了,但就像你说的我必须学习 C++(我还没准备好花时间在这上面)我只需要弄清楚如何使用代码在 C# windows 窗体中我的帖子中的链接上。
【解决方案3】:

UCOMIStream 已弃用,请改用 ComTypes.Istream。那就看System.Runtime.InteropServices.ComTypes.IStream to System.IO.Stream

【讨论】:

  • 关于如何将字符串移入和移出 ISTREAM 对象的任何指导?
  • IStream 不是(现有)对象;这是一个界面。您必须在自己的类中实现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多