2016-08-15 8 views
-1

J'ai une colonne d'image dans une base de données contenant des données RichText compressées. Je suppose que cela a été obtenu à partir d'Outlook (propriété PR_RTF_COMPRESSED ou quelque chose). J'ai besoin de le décompresser. En utilisant C#, j'essaie ce qui suit, mais je reçois une System.Runtime.InteropServices.COMExceptions et ne peux pas le comprendre.Décompressez Compresser le champ de texte enrichi

J'ai trouvé quelques anciens liens posant cette question, sans réponses résolues. Voici un extrait de mon code en utilisant C#.

public Form1() 
    { 
     InitializeComponent(); 
     IStream streamOut; 

     string con = "connection string"; 
     SqlCommand command = new SqlCommand("select top 10 columnInCompressedRichTextFormat FROM tableWithCompressedRichTextData", new SqlConnection(dbConnectionString)); 
     DataTable x = new DataTable(); 
     SqlDataAdapter a = new SqlDataAdapter(command); 
     a.Fill(x); 
     a.Dispose(); 

     foreach (DataRow r in dtResults.Rows) 
     { 
      byte[] arrayOfBytes = (byte[]) r["columnInCompressedRichTextFormat"]; 
      IStream i = CreateIStreamFromBytes(arrayOfBytes); 
      WrapCompressedRTFStream(input, 0, out streamOut); 
     } 
    } 

    public IStream CreateIStreamFromBytes(byte[] bytes) 
    { 
     IntPtr hglobal = Marshal.AllocHGlobal(bytes.Length); 
     Marshal.Copy(bytes, 0, hglobal, bytes.Length); 

     IStream stream = null; 

     CreateStreamOnHGlobal(hglobal, true, out stream); 

     return stream; 
    } 

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

    [DllImport("ole32.dll", PreserveSig = false)] 
    static extern int CreateStreamOnHGlobal(IntPtr hGlobal, 
     [MarshalAs(UnmanagedType.Bool)] bool fDeleteOnRelease, 
     [MarshalAs(UnmanagedType.Interface)] out IStream ppstm 
     ); 

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

WrapCompressedRTFStream renvoie l'erreur. Des idées?

Merci beaucoup.

+0

Personne ne peut vous aider sans l'erreur. Suivez les instructions ici http://idownvotedyoubecause.com/so/ImageOfAnException (scannez jusqu'à la section sur l'obtention des détails de l'exception) – Will

+0

Vous devez également vous assurer que vous chargez la bonne instance de msmapii32.dll au lieu de lier statiquement à mapi32. dll. Regardez le code source MFCMAPI pour voir comment cela est fait. –

+0

Est-ce que quelqu'un connaît la différence entre WrapCompressedRTFStream et WrapCompressedRTFStreamEx? –

Répondre