private void UnregisterTypeLibrary(RegistryKey rootKey) { try { ITypeLib typeLib; Guid libId; HRESULT hr = ComAPI.LoadTypeLib(TypeLibPath, out typeLib); if (hr != ComAPI.S_OK) { return; } IntPtr libAttrPtr; typeLib.GetLibAttr(out libAttrPtr); TYPELIBATTR typeLibAttr = (TYPELIBATTR)Marshal.PtrToStructure(libAttrPtr, typeof(TYPELIBATTR)); libId = typeLibAttr.guid; rootKey.DeleteSubKeyTree(@"TypeLib\" + libId.ToString("B").ToUpperInvariant()); typeLib.ReleaseTLibAttr(libAttrPtr); } catch (Exception e) { Debug.Print("TypeLibHelper.UnregisterServer error : " + e); } }
private Guid?RegisterTypeLibrary(string rootKeyName) { ITypeLib typeLib; Guid libId; HRESULT hr = ComAPI.LoadTypeLib(TypeLibPath, out typeLib); if (hr != ComAPI.S_OK) { return(null); } string helpDir = System.IO.Path.GetDirectoryName(TypeLibPath); if (helpDir != null && !System.IO.Directory.Exists(helpDir)) { helpDir = System.IO.Path.GetDirectoryName(DnaLibrary.XllPath); } // Deal with TYPELIBATTR IntPtr libAttrPtr; typeLib.GetLibAttr(out libAttrPtr); TYPELIBATTR typeLibAttr = (TYPELIBATTR)Marshal.PtrToStructure(libAttrPtr, typeof(TYPELIBATTR)); libId = typeLibAttr.guid; string libIdString = libId.ToString("B").ToUpperInvariant(); string version = typeLibAttr.wMajorVerNum.ToString(CultureInfo.InvariantCulture) + "." + typeLibAttr.wMinorVerNum.ToString(CultureInfo.InvariantCulture); // Get Friendly Name string friendlyName; string docString; int helpContext; string helpFile; typeLib.GetDocumentation(-1, out friendlyName, out docString, out helpContext, out helpFile); // string helpDir = System.IO.Path.GetDirectoryName(helpFile); // (or from TypeLibPath?) Registry.SetValue(rootKeyName + @"\TypeLib\" + libIdString + @"\" + version, null, friendlyName, RegistryValueKind.String); Registry.SetValue(rootKeyName + @"\TypeLib\" + libIdString + @"\" + version + @"\" + "FLAGS", null, typeLibAttr.wLibFlags, RegistryValueKind.DWord); if (helpDir != null) { Registry.SetValue(rootKeyName + @"\TypeLib\" + libIdString + @"\" + version + @"\" + "HELPDIR", null, helpDir, RegistryValueKind.String); } if (IntPtr.Size == 8) { Registry.SetValue(rootKeyName + @"\TypeLib\" + libIdString + @"\" + version + @"\" + typeLibAttr.lcid.ToString(CultureInfo.InvariantCulture) + @"\win64", null, TypeLibPath, RegistryValueKind.String); } else { Registry.SetValue(rootKeyName + @"\TypeLib\" + libIdString + @"\" + version + @"\" + typeLibAttr.lcid.ToString(CultureInfo.InvariantCulture) + @"\win32", null, TypeLibPath, RegistryValueKind.String); } typeLib.ReleaseTLibAttr(libAttrPtr); return(libId); }
internal static void RegisterClassFactory(CLSID clsId, ComAPI.IClassFactory classFactory) { // CONSIDER: Do we need to deal with the case where it is already in the list? // For now we expect it to throw... registeredClassFactories.Add(clsId, classFactory); }
static bool TryGetComClassType(CLSID clsId, out ComAPI.IClassFactory factory) { // Check among the persistently registered classes foreach (ExcelComClassType comClass in registeredComClassTypes) { if (comClass.ClsId == clsId) { factory = new ClassFactory(comClass); return true; } } factory = null; return false; }