Example #1
0
        //--------------------------------------------------------------------------------------------------

        bool InitByModule(string moduleName)
        {
            try
            {
                _Module = Win32Api.LoadLibrary(moduleName);
                if (_Module == IntPtr.Zero)
                {
                    return(false);
                }

                var proc = Win32Api.GetProcAddress(_Module, "DllGetClassObject");
                if (proc == IntPtr.Zero)
                {
                    return(false);
                }

                _GetClassObject = Marshal.GetDelegateForFunctionPointer(proc, typeof(DllGetClassObjectDelegate)) as DllGetClassObjectDelegate;

                return(_GetClassObject != null);
            }
            catch (Exception)
            {
                return(false);
            }
        }
Example #2
0
        private object GetClassInstance(Guid classguid, Guid interfguid, Guid classfactoryguid, Guid classfactory2guid)
        {
            object classinstance = null;

            // create instance via raw dll functions
            // ensures we get the real vtable
            try
            {
                if (classinstance == null)
                {
                    // Single do..while loop - to support "break;"
                    do
                    {
                        Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("CLSID\\{" + classguid.ToString() + "}\\InprocServer32");
                        if (rk == null)
                        {
                            break;
                        }
                        string classdllname = rk.GetValue(null).ToString();
                        IntPtr libH         = KERNEL32.LoadLibrary(classdllname);
                        if (libH == IntPtr.Zero)
                        {
                            break;
                        }
                        IntPtr factoryFunc = KERNEL32.GetProcAddress(libH, "DllGetClassObject");
                        if (factoryFunc == IntPtr.Zero)
                        {
                            break;
                        }
                        DllGetClassObjectDelegate factoryDel = (DllGetClassObjectDelegate)Marshal.GetDelegateForFunctionPointer(factoryFunc, typeof(DllGetClassObjectDelegate));
                        object classfactoryO;
                        // Try with IClassFactory first
                        factoryDel(ref classguid, ref classfactoryguid, out classfactoryO);
                        if (classfactoryO != null)
                        {
                            IClassFactory classfactory = (IClassFactory)classfactoryO;
                            classfactory.CreateInstance(null, ref interfguid, out classinstance);
                            Marshal.FinalReleaseComObject(classfactory);
                        }
                        else
                        {
                            // Now try with IClassFactory2
                            factoryDel(ref classguid, ref classfactory2guid, out classfactoryO);
                            if (classfactoryO == null)
                            {
                                break;
                            }
                            IClassFactory2 classfactory = (IClassFactory2)classfactoryO;
                            classinstance = classfactory.CreateInstance(null, interfguid);
                            Marshal.FinalReleaseComObject(classfactory);
                        }
                    } while (false);
                }
            }
            catch { }

            return(classinstance);
        }
Example #3
0
        //--------------------------------------------------------------------------------------------------

        void ReleaseUnmanagedResources()
        {
            if (_Module != IntPtr.Zero)
            {
                Win32Api.FreeLibrary(_Module);
                _Module = IntPtr.Zero;
            }

            _GetClassObject = null;
        }
Example #4
0
        /// <summary>
        /// Load a COM object from the supplied assembly using the supplied class ID and interface ID.
        /// </summary>
        /// <param name="pathToNativeAssembly">Path to assembly</param>
        /// <param name="clsid">Class ID</param>
        /// <param name="iid">Interface ID</param>
        /// <returns>Loaded COM instance</returns>
        public static object CreateInstanceFrom(
            string pathToNativeAssembly,
            Guid clsid,
            Guid iid)
        {
            if (string.IsNullOrEmpty(pathToNativeAssembly))
            {
                throw new ArgumentNullException(nameof(pathToNativeAssembly));
            }

            IntPtr nativeDllPointer = NativeMethods.LoadLibraryEx(
                pathToNativeAssembly,
                IntPtr.Zero,
                NativeMethods.LoadLibraryFlags.LOAD_WITH_ALTERED_SEARCH_PATH);

            if (nativeDllPointer == IntPtr.Zero)
            {
                throw new DllNotFoundException(pathToNativeAssembly);
            }

            IntPtr dllGetClassObjectFunctionPointer = NativeMethods.GetProcAddress(nativeDllPointer, "DllGetClassObject");

            if (dllGetClassObjectFunctionPointer == IntPtr.Zero)
            {
                throw new NullReferenceException("DllGetClassObject");
            }

#pragma warning disable 618
            DllGetClassObjectDelegate dllGetClassObject = (DllGetClassObjectDelegate)Marshal.GetDelegateForFunctionPointer(
#pragma warning restore 618
                dllGetClassObjectFunctionPointer,
                typeof(DllGetClassObjectDelegate));

            object ppv      = null;
            object instance = null;
            dllGetClassObject(clsid, typeof(IClassFactory).GetTypeInfo().GUID, out ppv);

            IClassFactory factory = ppv as IClassFactory;
            if (factory != null)
            {
                instance = factory.CreateInstance(null, iid);
                Marshal.ReleaseComObject(factory);
            }

            return(instance);
        }