예제 #1
0
 private static void WriteProperty(OLEStructuredStorage.IPropertyStorage propertyStorage, int propid, string value)
 {
     if (!string.IsNullOrEmpty(value))
     {
         OLEStructuredStorage.PropVariant propertyValues        = default(OLEStructuredStorage.PropVariant);
         OLEStructuredStorage.PropSpec    propertySpecification = default(OLEStructuredStorage.PropSpec);
         propertySpecification.ulKind = 1;
         propertySpecification.strPtr = new IntPtr(propid);
         try
         {
             propertyValues.FromString(value);
             propertyStorage.WriteMultiple(1u, ref propertySpecification, ref propertyValues, 2);
             propertyStorage.Commit(0);
         }
         finally
         {
             propertyValues.Dispose();
         }
     }
 }
예제 #2
0
        internal static bool CreateMultiStreamFile(Stream[] sources, string[] streamNames, string clsId, string author, string title, string comments, Stream output, bool forceInMemory)
        {
            OLEStructuredStorage.UCOMIStorage   storage        = null;
            OLEStructuredStorage.UCOMILockBytes uCOMILockBytes = null;
            IStream stream = null;
            string  text   = null;
            Guid    clsid  = new Guid(clsId);
            long    num    = 0L;
            long    num2   = 0L;

            for (int i = 0; i < sources.Length; i++)
            {
                num2 = Math.Max(sources[i].Length, num2);
                num += sources[i].Length;
            }
            int num3 = Math.Min(1048576, (int)num2 + 512);

            try
            {
                int grfMode  = 134221842;
                int grfMode2 = 18;
                text = Path.GetTempPath() + Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture) + ".doc.tmp";
                if (OLEStructuredStorage.StgCreateDocfile(text, grfMode, 0, out storage) != 0)
                {
                    return(false);
                }
                byte[] array = new byte[num3];
                for (int j = 0; j < streamNames.Length; j++)
                {
                    sources[j].Seek(0L, SeekOrigin.Begin);
                    storage.CreateStream(streamNames[j], grfMode2, 0, 0, out stream);
                    if (stream != null)
                    {
                        IntPtr pcbWritten = default(IntPtr);
                        int    num4       = 0;
                        while ((num4 = sources[j].Read(array, 0, num3)) > 0)
                        {
                            stream.Write(array, num4, pcbWritten);
                        }
                        sources[j] = null;
                    }
                    Marshal.ReleaseComObject(stream);
                    stream = null;
                }
                OLEStructuredStorage.IPropertySetStorage propSetStg      = null;
                OLEStructuredStorage.IPropertyStorage    propertyStorage = null;
                OLEStructuredStorage.StgCreatePropSetStg(storage, 0, out propSetStg);
                Guid rfmtid = new Guid("{F29F85E0-4FF9-1068-AB91-08002B27B3D9}");
                propSetStg.Create(ref rfmtid, IntPtr.Zero, 0, grfMode2, out propertyStorage);
                WriteProperty(propertyStorage, 2, title);
                WriteProperty(propertyStorage, 4, author);
                WriteProperty(propertyStorage, 6, comments);
                Marshal.ReleaseComObject(propertyStorage);
                Marshal.ReleaseComObject(propSetStg);
                storage.SetClass(ref clsid);
                storage.Commit(0);
                Marshal.ReleaseComObject(storage);
                storage = null;
                using (Stream stream2 = File.OpenRead(text))
                {
                    int num5 = 0;
                    while ((num5 = stream2.Read(array, 0, array.Length)) > 0)
                    {
                        output.Write(array, 0, num5);
                    }
                }
                array = null;
                return(true);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (!string.IsNullOrEmpty(text) && File.Exists(text))
                {
                    File.Delete(text);
                }
                if (stream != null)
                {
                    Marshal.ReleaseComObject(stream);
                    stream = null;
                }
                if (storage != null)
                {
                    Marshal.ReleaseComObject(storage);
                    storage = null;
                }
                if (uCOMILockBytes != null)
                {
                    Marshal.ReleaseComObject(uCOMILockBytes);
                    uCOMILockBytes = null;
                }
            }
        }