//-------------------------------------------------------------------------------------------------- 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); } }
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); }
//-------------------------------------------------------------------------------------------------- void ReleaseUnmanagedResources() { if (_Module != IntPtr.Zero) { Win32Api.FreeLibrary(_Module); _Module = IntPtr.Zero; } _GetClassObject = null; }
/// <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); }