2010-05-06 2 views
0

Я использую VS 2008 C# Приложение Windows.Доступ к «Mapi32.dll» с помощью C#

У меня есть этот 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(), что-то, что-то);

Первая ошибка, я получаю «не удается преобразовать из„строки“в«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 
); 

Настоящая проблема заключается в том, что я не понимаю, что/как обрабатывать вход и выход этого метода.

+0

Вы не можете разжать без знания алгоритма сжатия – Midhat

+0

Это формат сжатия microsoft OutlookRichText. –

+0

@Midhat: это точка этой функции. Посмотрите параметры входа и выхода. – MSalters

ответ

0

Я предполагаю, что это не очень хорошая идея использовать наследие родной-код библиотеки & я бы исследовать еще некоторое время, чтобы найти аналогичный код в .net

Попробуйте COM Interop или р-вызова .net технологии для использования устаревшего кода.

+0

Я попытался использовать его с помощью com-взаимодействия, но мне не удалось заставить его работать. Если посмотреть на код в ссылке, можете ли вы помочь мне использовать его с interop? (Я не хочу изучать C++ на этом этапе.) Что касается аналогичного кода в .net. Я пока не нашел. –

+0

Возможно, эта статья поможет: http://www.c-sharpcorner.com/uploadfile/rambab/outlookintegration10282006032802am/outlookintegration.aspx –

0

Если вы не можете найти собственный .NET-метод для этого, хорошим подходом было бы сдерживание вашего подхода в оболочке управляемого C++.

Что бы вы сделали, это создать код на C++ для выполнения вашей работы, а выставляя управляемый класс вызывать метод. Это может быть более сложным, так как вам потребуется изучить Managed C++, но позволяет выполнять любую работу на C++, возвращая строку .NET, содержащую ваш «ответ».

+0

хорошо, это было бы здорово, но, как вы сказали, мне нужно будет изучить C++ (я пока не готов тратить время на это). Мне просто нужно выяснить, как использовать код в ссылке в моем сообщении в форме окна C#. –

0

UCOMIStream устарел, вместо этого используйте ComTypes.Istream. Затем посмотрите на System.Runtime.InteropServices.ComTypes.IStream to System.IO.Stream

+0

Любые указания относительно того, как перемещать строки в и из объекта ISTREAM? –

+0

IStream не является (существующим) объектом; это интерфейс. Вам придется реализовать его в своем классе. – MSalters

Смежные вопросы