zoukankan      html  css  js  c++  java
  • 不注册Activex 直接调用它

    此处的Activex是ATL方式的。

    [ComVisible(false)]
        [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00000001-0000-0000-C000-000000000046")]
        internal interface IClassFactory
        {
            void CreateInstance([MarshalAs(UnmanagedType.Interface)] object pUnkOuter, ref Guid refiid, [MarshalAs(UnmanagedType.Interface)] out object ppunk);
            void LockServer(bool fLock);
        }
        public delegate void IETestKey(IntPtr values);

        internal static class ComHelper
        {
            //DllGetClassObject fuction pointer signature
            private delegate int DllGetClassObject(ref Guid ClassId, ref Guid InterfaceId, [Out, MarshalAs(UnmanagedType.Interface)] out object ppunk);

            //Some win32 methods to loadunload dlls and get a function pointer
            private class Win32NativeMethods
            {
                [DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
                public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);

                [DllImport("kernel32.dll")]
                public static extern bool FreeLibrary(IntPtr hModule);

                [DllImport("kernel32.dll")]
                public static extern IntPtr LoadLibrary(string lpFileName);
            }

            /// <summary>
            /// Holds a list of dll handles and unloads the dlls
            /// in the destructor
            /// </summary>
            private class DllList
            {
                private List<IntPtr> _dllList = new List<IntPtr>();
                public void AddDllHandle(IntPtr dllHandle)
                {
                    lock (_dllList)
                    {
                        _dllList.Add(dllHandle);
                    }
                }

                ~DllList()
                {
                    foreach (IntPtr dllHandle in _dllList)
                    {
                        try
                        {
                            Win32NativeMethods.FreeLibrary(dllHandle);
                        }
                        catch { };
                    }
                }
            }

            static DllList _dllList = new DllList();

            /// <summary>
            /// Gets a class factory for a specific COM Class ID.
            /// </summary>
            /// <param name="dllName">The dll where the COM class is implemented</param>
            /// <param name="filterPersistClass">The requested Class ID</param>
            /// <returns>IClassFactory instance used to create instances of that class</returns>
            internal static IClassFactory GetClassFactory(string dllName, string filterPersistClass)
            {
                //Load the class factory from the dll
                IClassFactory classFactory = GetClassFactoryFromDll(dllName, filterPersistClass);
                return classFactory;
            }

            private static IClassFactory GetClassFactoryFromDll(string dllName, string filterPersistClass)
            {
                //Load the dll
                IntPtr dllHandle = Win32NativeMethods.LoadLibrary(dllName);
                if (dllHandle == IntPtr.Zero)
                    return null;

                //Keep a reference to the dll until the processAppDomain dies
                _dllList.AddDllHandle(dllHandle);

                //Get a pointer to the DllGetClassObject function
                IntPtr dllGetClassObjectPtr = Win32NativeMethods.GetProcAddress(dllHandle, "DllGetClassObject");
                if (dllGetClassObjectPtr == IntPtr.Zero)
                    return null;

                //Convert the function pointer to a .net delegate
                DllGetClassObject dllGetClassObject = (DllGetClassObject)Marshal.GetDelegateForFunctionPointer(dllGetClassObjectPtr, typeof(DllGetClassObject));

                //Call the DllGetClassObject to retreive a class factory for out Filter class
                Guid filterPersistGUID = new Guid(filterPersistClass);
                //Guid IClassFactoryGUID = new Guid("FCF82F0F-F8A9-4527-A36E-CC87FAFAA270"); //IClassFactory class id
                Guid IClassFactoryGUID = new Guid("00000001-0000-0000-C000-000000000046"); //IClassFactory class id
                Object unk;
                if (dllGetClassObject(ref filterPersistGUID, ref IClassFactoryGUID, out unk) != 0)
                    return null;

                //Yippie! cast the returned object to IClassFactory
                return (unk as IClassFactory);
            }

           

            public static Delegate TestDll(string dllName)
            {
                IntPtr dllHandle = Win32NativeMethods.LoadLibrary(dllName);
                if (dllHandle == IntPtr.Zero)
                    return null;

                //Keep a reference to the dll until the processAppDomain dies
                //_dllList.AddDllHandle(dllHandle);

                //Get a pointer to the DllGetClassObject function
                IntPtr dllGetClassObjectPtr = Win32NativeMethods.GetProcAddress(dllHandle, "DllGetClassObject");
                if (dllGetClassObjectPtr == IntPtr.Zero)
                    return null;

                return (Delegate)Marshal.GetDelegateForFunctionPointer(dllGetClassObjectPtr, typeof(IETestKey));
            }
        }

    不说废话,上代码

    public enum IFilterReturnCode : uint
        {
            /// <summary>
            /// Success
            /// </summary>
            S_OK = 0,
            /// <summary>
            /// The function was denied access to the filter file.
            /// </summary>
            E_ACCESSDENIED = 0x80070005,
            /// <summary>
            /// The function encountered an invalid handle,
            /// probably due to a low-memory situation.
            /// </summary>
            E_HANDLE = 0x80070006,
            /// <summary>
            /// The function received an invalid parameter.
            /// </summary>
            E_INVALIDARG = 0x80070057,
            /// <summary>
            /// Out of memory
            /// </summary>
            E_OUTOFMEMORY = 0x8007000E,
            /// <summary>
            /// Not implemented
            /// </summary>
            E_NOTIMPL = 0x80004001,
            /// <summary>
            /// Unknown error
            /// </summary>
            E_FAIL = 0x80000008,
            /// <summary>
            /// File not filtered due to password protection
            /// </summary>
            FILTER_E_PASSWORD = 0x8004170B,
            /// <summary>
            /// The document format is not recognised by the filter
            /// </summary>
            FILTER_E_UNKNOWNFORMAT = 0x8004170C,
            /// <summary>
            /// No text in current chunk
            /// </summary>
            FILTER_E_NO_TEXT = 0x80041705,
            /// <summary>
            /// No more chunks of text available in object
            /// </summary>
            FILTER_E_END_OF_CHUNKS = 0x80041700,
            /// <summary>
            /// No more text available in chunk
            /// </summary>
            FILTER_E_NO_MORE_TEXT = 0x80041701,
            /// <summary>
            /// No more property values available in chunk
            /// </summary>
            FILTER_E_NO_MORE_VALUES = 0x80041702,
            /// <summary>
            /// Unable to access object
            /// </summary>
            FILTER_E_ACCESS = 0x80041703,
            /// <summary>
            /// Moniker doesn't cover entire region
            /// </summary>
            FILTER_W_MONIKER_CLIPPED = 0x00041704,
            /// <summary>
            /// Unable to bind IFilter for embedded object
            /// </summary>
            FILTER_E_EMBEDDING_UNAVAILABLE = 0x80041707,
            /// <summary>
            /// Unable to bind IFilter for linked object
            /// </summary>
            FILTER_E_LINK_UNAVAILABLE = 0x80041708,
            /// <summary>
            ///  This is the last text in the current chunk
            /// </summary>
            FILTER_S_LAST_TEXT = 0x00041709,
            /// <summary>
            /// This is the last value in the current chunk
            /// </summary>
            FILTER_S_LAST_VALUES = 0x0004170A
        }

        [ComImport, Guid("接口的GUID")]
        [InterfaceType(ComInterfaceType.InterfaceIsDual)]
        public interface ISISSKeyManager
        {      
            [DispId(1)]
            IFilterReturnCode IETestKey([Out, MarshalAs(UnmanagedType.BStr)] out string KeyInfo);
            [DispId(2)]
            IFilterReturnCode CheckKeys([In, MarshalAs(UnmanagedType.BStr)]string KeyInfo, [In, MarshalAs(UnmanagedType.BStr)]string KeyInfo2, [Out, MarshalAs(UnmanagedType.BStr)]out string KeyTest);
        }

       public class LoadDllHelper
        {
           public static ISISSKeyManager LoadFilterFromDll(string dllName, string filterPersistClass)
           {
               //Get a classFactory for our classID
               IClassFactory classFactory = ComHelper.GetClassFactory(dllName, filterPersistClass);
               if (classFactory == null)
                   return null;

               //And create an IFilter instance using that class factory
               Guid IFilterGUID = new Guid("接口的GUID");
               Object obj;
               classFactory.CreateInstance(null, ref IFilterGUID, out obj);
               return (obj as ISISSKeyManager);
           }
        }

    调用方式:

    var gethelperId = LoadDllHelper.LoadFilterFromDll("xxxx.dll", "com的GUID");
                    if (gethelperId != null)
                    {
                        string str = "1".PadLeft(300, '1');
                        IntPtr outPtr = Marshal.StringToBSTR(str);
                        var s = gethelperId.IETestKey(out str);
                        MessageBox.Show(s.ToString());
                    }

  • 相关阅读:
    Apache与Nginx的优缺点比较
    [PHP基础]有关isset empty 函数的面试题
    PHP求解一个值是否为质数
    15个魔术方法的总结
    对象在类中的存储方式有哪些?
    cookie大小
    Tp3.2 和 Tp5.0之间的区别
    经典的面试题,(这是著名的约瑟夫环问题)
    怎么计算数据库有多大的数据量
    [置顶] 实用电子电路设计丛书
  • 原文地址:https://www.cnblogs.com/forhell/p/3270750.html
Copyright © 2011-2022 走看看