Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7598925
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 30, 20262026-05-30T22:31:55+00:00 2026-05-30T22:31:55+00:00

I am adding a few different file types to slides in powerpoint. These types

  • 0

I am adding a few different file types to slides in powerpoint. These types include mp4, zip, swf, and other formats. I am not looking for a way to play these file types back; however, I’d like to store and retrieve files from within a powerpoint preso.

I’ve successfully stored these various file types by doing the following:

currentSlide.Shapes.AddOLEObject(0, 0, -1, -1, "", this.filePath);

I can also retrieve them manually by Right Clicking the Object -> Selecting Edit Package -> File -> Save Content.

I am looking to replicate or use this functionality to save the contents of the OLEObject back to its original state and to a path I specify. I have a way to find that shape and I think this object contains the contents: slideShape.OLEFormat.ObjectI just don’t know what to do now. Ideas? Thanks.

Oh I am using office 2010, if that makes any sort of difference.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-30T22:31:57+00:00Added an answer on May 30, 2026 at 10:31 pm

    So, I know this is late; however, I know others must have similar questions.

    I contacted Microsoft about this issue and it took them around a month or so, but they finally got me an answer. I have a zip of the solution. It is fairly extensive, look below for just plain source code.

    First some instructions:

    1) Create a PowerPoint presentation and embed some files in it (Video, mp3, zip etc)
    2) Save the file to the following location C:\Temp\Temp.pptx
    3) Close the file
    4) Create a folder “GeneratedFiles” under “C:\Temp”
    5) Open the application and run it.

    So the only downside is that the PPTX file must be closed. That being said, one might be able to copy the open PPTX file elsewhere and then extracted the files from that location rather than the PPTX that is actually being worked on. Then just delete the temporary one. We will see. This is as close as this solution gets though.

    Without further adieu:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using System.IO.Packaging;
    using System.Runtime.InteropServices;
    using System.IO;
    
    namespace ExtractOLEPowerPoint
    {
    class Program
    {
    
        #region IEnumSTATSTG
        [ComImport]
        [Guid("0000000d-0000-0000-C000-000000000046")]
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IEnumSTATSTG
        {
            // The user needs to allocate an STATSTG array whose size is celt.
            [PreserveSig]
            uint Next(uint celt, [MarshalAs(UnmanagedType.LPArray), Out] System.Runtime.InteropServices.ComTypes.STATSTG[] rgelt, out uint pceltFetched);
    
            void Skip(uint celt);
    
            void Reset();
    
            [return: MarshalAs(UnmanagedType.Interface)]
            IEnumSTATSTG Clone();
        }
        #endregion
    
        //#region IStream
    
        //[ComImport, Guid("0000000c-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        //public interface IStream
        //{
        //    void Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pv, uint cb, out uint pcbRead);
        //    void Write([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pv, uint cb, out uint pcbWritten);
        //    void Seek(long dlibMove, uint dwOrigin, out long plibNewPosition);
        //    void SetSize(long libNewSize);
        //    void CopyTo(IStream pstm, long cb, out long pcbRead, out long pcbWritten);
        //    void Commit(uint grfCommitFlags);
        //    void Revert();
        //    void LockRegion(long libOffset, long cb, uint dwLockType);
        //    void UnlockRegion(long libOffset, long cb, uint dwLockType);
        //    void Stat(out STATSTG pstatstg, uint grfStatFlag);
        //    void Clone(out IStream ppstm);
        //}
    
        //#endregion
    
        #region STATFLAG
    
        [Flags]
        public enum STATFLAG : uint
        {
            STATFLAG_DEFAULT = 0,
            STATFLAG_NONAME = 1,
            STATFLAG_NOOPEN = 2
        }
    
        #endregion
    
        #region IStorage
        [ComImport]
        [Guid("0000000b-0000-0000-C000-000000000046")]
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        interface IStorage
        {
            void CreateStream(
                /* [string][in] */ string pwcsName,
                /* [in] */ uint grfMode,
                /* [in] */ uint reserved1,
                /* [in] */ uint reserved2,
                /* [out] */ out System.Runtime.InteropServices.ComTypes.IStream ppstm);
            void OpenStream(
                /* [string][in] */ string pwcsName,
                /* [unique][in] */ IntPtr reserved1,
                /* [in] */ uint grfMode,
                /* [in] */ uint reserved2,
                /* [out] */ out System.Runtime.InteropServices.ComTypes.IStream ppstm);
    
            void CreateStorage(
                /* [string][in] */ string pwcsName,
                /* [in] */ uint grfMode,
                /* [in] */ uint reserved1,
                /* [in] */ uint reserved2,
                /* [out] */ out IStorage ppstg);
    
            void OpenStorage(
                /* [string][unique][in] */ string pwcsName,
                /* [unique][in] */ IStorage pstgPriority,
                /* [in] */ uint grfMode,
                /* [unique][in] */ IntPtr snbExclude,
                /* [in] */ uint reserved,
                /* [out] */ out IStorage ppstg);
    
            void CopyTo(
                /* [in] */ uint ciidExclude,
                /* [size_is][unique][in] */ Guid rgiidExclude, // should this be an array?
                /* [unique][in] */ IntPtr snbExclude,
                /* [unique][in] */ IStorage pstgDest);
    
            void MoveElementTo(
                /* [string][in] */ string pwcsName,
                /* [unique][in] */ IStorage pstgDest,
                /* [string][in] */ string pwcsNewName,
                /* [in] */ uint grfFlags);
    
            void Commit(
                /* [in] */ uint grfCommitFlags);
    
            void Revert();
    
            void EnumElements(
                /* [in] */ uint reserved1,
                /* [size_is][unique][in] */ IntPtr reserved2,
                /* [in] */ uint reserved3,
                /* [out] */ out IEnumSTATSTG ppenum);
    
            void DestroyElement(
                /* [string][in] */ string pwcsName);
    
            void RenameElement(
                /* [string][in] */ string pwcsOldName,
                /* [string][in] */ string pwcsNewName);
    
            void SetElementTimes(
                /* [string][unique][in] */ string pwcsName,
                /* [unique][in] */ System.Runtime.InteropServices.ComTypes.FILETIME pctime,
                /* [unique][in] */ System.Runtime.InteropServices.ComTypes.FILETIME patime,
                /* [unique][in] */ System.Runtime.InteropServices.ComTypes.FILETIME pmtime);
    
            void SetClass(
                /* [in] */ Guid clsid);
    
            void SetStateBits(
                /* [in] */ uint grfStateBits,
                /* [in] */ uint grfMask);
    
            void Stat(
                /* [out] */ out System.Runtime.InteropServices.ComTypes.STATSTG pstatstg,
                /* [in] */ uint grfStatFlag);
        }
    
        #endregion
    
        #region STGM
        [Flags]
        public enum STGM : int
        {
            DIRECT           = 0x00000000,
            TRANSACTED       = 0x00010000,
            SIMPLE           = 0x08000000,
            READ             = 0x00000000,
            WRITE            = 0x00000001,
            READWRITE        = 0x00000002,
            SHARE_DENY_NONE  = 0x00000040,
            SHARE_DENY_READ  = 0x00000030,
            SHARE_DENY_WRITE = 0x00000020,
            SHARE_EXCLUSIVE  = 0x00000010,
            PRIORITY         = 0x00040000,
            DELETEONRELEASE  = 0x04000000,
            NOSCRATCH        = 0x00100000,
            CREATE           = 0x00001000,
            CONVERT          = 0x00020000,
            FAILIFTHERE      = 0x00000000,
            NOSNAPSHOT       = 0x00200000,
            DIRECT_SWMR      = 0x00400000,
        }
    
        #endregion
    
        #region StgIsStorageFile
    
        [DllImport("Ole32.dll")]
        static extern int StgIsStorageFile([MarshalAs(UnmanagedType.LPWStr)]string filename);
    
        #endregion
    
        #region StgOpenStorage
    
        [DllImport("Ole32.dll")]
        static extern int StgOpenStorage([MarshalAs(UnmanagedType.LPWStr)]string pwcsName, IStorage pstgPriority, STGM grfmode, IntPtr snbExclude, uint researved, out IStorage ppstgOpen);
    
        #endregion
    
        static void Main(string[] args)
        {
            Package pkg = Package.Open("C:\\Temp\\Temp.pptx");
            foreach (PackagePart pkgprt in pkg.GetParts())
            {
                if(pkgprt.Uri.ToString().StartsWith("/ppt/embeddings/"))
                {
                    System.IO.Stream strm = pkgprt.GetStream();
                    byte[] buffer = new byte[strm.Length];
                    strm.Read(buffer, 0, (int)strm.Length);
                    strm.Close();
    
                    // Create a temporary file
                    string targetFile = "C:\\Temp\\GeneratedFiles\\" + pkgprt.Uri.ToString().Remove(0, "/ppt/embeddings/".Length);
                    System.IO.File.WriteAllBytes(targetFile, buffer);
    
                    // Extract the contents.
                    IStorage Is;
                    StgOpenStorage(targetFile, null, STGM.READWRITE | STGM.SHARE_EXCLUSIVE, IntPtr.Zero, 0, out Is);
                    ProcessPackage(Is);
    
                    // Need to release the IStorage object and call GC.Collect() to free the object
                    Marshal.ReleaseComObject(Is);
                    Is = null;
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
    
                    // Delete the temporary binary file extracted
                    File.Delete(targetFile);
                }
            }
        }
        static void ProcessPackage(IStorage pStg)
        {
            System.Runtime.InteropServices.ComTypes.IStream pStream;
            IEnumSTATSTG pEnumStatStg;
            uint numReturned;
            pStg.EnumElements(0, IntPtr.Zero, 0, out pEnumStatStg);
            System.Runtime.InteropServices.ComTypes.STATSTG[] ss = new System.Runtime.InteropServices.ComTypes.STATSTG[1];
            // Loop through the STATSTG structures in the storage.
            do
            {
                // Retrieve the STATSTG structure
                pEnumStatStg.Next(1, ss, out numReturned);
                if (numReturned != 0)
                {
                    //System.Runtime.InteropServices.ComTypes.STATSTG statstm;
                    byte[] bytT = new byte[4];
                    // Check if the pwcsName contains "Ole10Native" stream which contain the actual embedded object
                    if (ss[0].pwcsName.Contains("Ole10Native") == true)
                    {
                        // Get the stream objectOpen the stream
                        pStg.OpenStream(ss[0].pwcsName, IntPtr.Zero, (uint)STGM.READ | (uint)STGM.SHARE_EXCLUSIVE, 0, out pStream);
                        //pStream.Stat(out statstm, (int) STATFLAG.STATFLAG_DEFAULT);
    
                        IntPtr position = IntPtr.Zero;
                        // File name starts from 7th Byte.
                        // Position the cursor to the 7th Byte.
                        pStream.Seek(6, 0, position);
    
                        IntPtr ulRead = new IntPtr();
                        char[] filename = new char[260];
                        int i;
    
                        // Read the File name of the embedded object
                        for (i = 0; i < 260; i++)
                        {
                            pStream.Read(bytT, 1, ulRead);
                            pStream.Seek(0, 1, position);
                            filename[i] = (char)bytT[0];
                            if (bytT[0] == 0)
                            {
                                break;
                            }
                        }
                        string path = new string(filename, 0, i);
    
                        // Next part is the source path of the embedded object.
                        // Length is unknown. Hence, loop through each byte to read the 0 terminated string
                        // Read the source path.
                        for (i = 0; i < 260; i++)
                        {
                            pStream.Read(bytT, 1, ulRead);
                            pStream.Seek(0, 1, position);
                            filename[i] = (char)bytT[0];
                            if (bytT[0] == 0)
                            {
                                break;
                            }
                        }
                        // Source File path
                        string fullpath = new string(filename, 0, i);
    
                        // Unknown 4 bytes
                        pStream.Seek(4, 1, position);
    
                        // Next 4 byte gives the length of the temporary file path 
                        // (Office uses a temporary location to copy the files before inserting to the document)
                        // The length is in little endian format. Hence conversion is needed
                        pStream.Read(bytT, 4, ulRead);
                        ulong dwSize, dwTemp;
                        dwSize = 0;
                        dwTemp = (ulong)bytT[3];
                        dwSize += (ulong)(bytT[3] << 24);
                        dwSize += (ulong)(bytT[2] << 16);
                        dwSize += (ulong)(bytT[1] << 8);
                        dwSize += bytT[0];
    
                        // Skip the temporary file path
                        pStream.Seek((long)dwSize, 1, position);
    
                        // Next four bytes gives the size of the actual data in little endian format.
                        // Convert the format.
                        pStream.Read(bytT, 4, ulRead);
                        dwTemp = 0;
                        dwSize = 0;
                        dwTemp = (ulong)bytT[3];
                        dwSize += (ulong)(bytT[3] << 24);
                        dwSize += (ulong)(bytT[2] << 16);
                        dwSize += (ulong)(bytT[1] << 8);
                        dwSize += (ulong)bytT[0];
    
                        // Read the actual file content 
                        byte[] byData = new byte[dwSize];
                        pStream.Read(byData, (int)dwSize, ulRead);
    
                        // Create the file
                        System.IO.BinaryWriter bWriter = new System.IO.BinaryWriter(System.IO.File.Open("C:\\temp\\GeneratedFiles\\" + path, System.IO.FileMode.Create));
                        bWriter.Write(byData);
                        bWriter.Close();
                    }
                }
            }
            while (numReturned > 0);
        }
    }
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have seen a few different methods for adding classes to dynamically created elements
I am adding a few new features to a small project i'm working on
I need to make changes to an in-use production database. Just adding a few
Context: I'm working on master adding a simple feature. After a few minutes I
I'm using jQuery to dynamically add new divs containing a few fields. I'm adding
I have a Rails app representing a card game. There are several different types
I have a lot of pre-existing projects and code in a few different Subversion
I have a few different applications that share some common DLLs. At the moment
I have a stack panel with a few (different) items: <StackPanel ...> <TextBlock ...
I know that there are quite a few different topics out there but I

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.