使用C#访问“Mapi32.dll”

时间:2010-05-06 09:01:44

标签: c# c++ dllimport istream

我正在使用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
);

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

3 个答案:

答案 0 :(得分:0)

我认为使用传统的本机代码库并不是一个好主意。我会再花一些时间在.net

中找到类似的代码

尝试使用 com interop p-invoke .net 技术来使用旧代码。

答案 1 :(得分:0)

如果找不到本机.NET方法,那么一个好的方法就是在Managed C ++包装器中包含你的方法。

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

答案 2 :(得分:0)

不推荐使用UCOMIStream,而是使用ComTypes.Istream。然后查看System.Runtime.InteropServices.ComTypes.IStream to System.IO.Stream