private async void OpenObjectInformation(object comObj, string defaultName) { if (comObj != null) { Dictionary <string, string> props = new Dictionary <string, string>(); string strObjName = ""; IEnumerable <COMInterfaceEntry> ints = null; Guid clsid = COMUtilities.GetObjectClass(comObj); if (m_registry.Clsids.ContainsKey(clsid)) { COMCLSIDEntry ent = m_registry.Clsids[clsid]; strObjName = ent.Name; props.Add("CLSID", ent.Clsid.ToString("B")); props.Add("Name", ent.Name); props.Add("Server", ent.Server); await ent.LoadSupportedInterfacesAsync(false); ints = ent.Interfaces.Select(i => m_registry.MapIidToInterface(i.Iid)); } else { ints = m_registry.GetInterfacesForObject(comObj); strObjName = defaultName != null ? defaultName : clsid.ToString("B"); props.Add("CLSID", clsid.ToString("B")); } Type dispType = COMUtilities.GetDispatchTypeInfo(comObj); HostControl(new ObjectInformation(m_registry, strObjName, comObj, props, ints.ToArray())); } }
private async void menuViewCreateInstanceFromCLSID_Click(object sender, EventArgs e) { using (CreateCLSIDForm frm = new CreateCLSIDForm()) { if (frm.ShowDialog() == DialogResult.OK) { try { Guid g = frm.Clsid; Dictionary <string, string> props = new Dictionary <string, string>(); object comObj = null; string strObjName = ""; IEnumerable <COMInterfaceEntry> ints = null; if (m_registry.Clsids.ContainsKey(g)) { COMCLSIDEntry ent = m_registry.Clsids[g]; strObjName = ent.Name; props.Add("CLSID", ent.Clsid.ToString("B")); props.Add("Name", ent.Name); props.Add("Server", ent.Server); comObj = ent.CreateInstanceAsObject(frm.ClsCtx); await ent.LoadSupportedInterfacesAsync(false); } else { Guid unk = COMInterfaceEntry.IID_IUnknown; IntPtr pObj; if (COMUtilities.CoCreateInstance(ref g, IntPtr.Zero, frm.ClsCtx, ref unk, out pObj) == 0) { ints = m_registry.GetInterfacesForIUnknown(pObj); comObj = Marshal.GetObjectForIUnknown(pObj); strObjName = g.ToString("B"); props.Add("CLSID", g.ToString("B")); Marshal.Release(pObj); } } if (comObj != null) { /* Need to implement a type library reader */ Type dispType = COMUtilities.GetDispatchTypeInfo(comObj); HostControl(new ObjectInformation(m_registry, strObjName, comObj, props, ints.ToArray())); } } catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } }
private async void btnRefreshInterfaces_Click(object sender, EventArgs e) { try { COMCLSIDEntry entry = (COMCLSIDEntry)tabPageSupportedInterfaces.Tag; await entry.LoadSupportedInterfacesAsync(true); LoadInterfaceList(entry.Interfaces, listViewInterfaces); LoadInterfaceList(entry.FactoryInterfaces, listViewFactoryInterfaces); } catch (Exception ex) { MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private async void createInstanceToolStripMenuItem_Click(object sender, EventArgs e) { TreeNode node = treeComRegistry.SelectedNode; if (node != null) { COMCLSIDEntry ent = null; if (node.Tag is COMCLSIDEntry) { ent = (COMCLSIDEntry)node.Tag; } else if (node.Tag is COMProgIDEntry) { ent = m_reg.MapClsidToEntry(((COMProgIDEntry)node.Tag).Clsid); } if (ent != null) { Dictionary <string, string> props = new Dictionary <string, string>(); try { object comObj = ent.CreateInstanceAsObject(CLSCTX.CLSCTX_ALL); if (comObj != null) { props.Add("CLSID", ent.Clsid.ToString("B")); props.Add("Name", ent.Name); props.Add("Server", ent.Server); /* Need to implement a type library reader */ Type dispType = COMUtilities.GetDispatchTypeInfo(comObj); await ent.LoadSupportedInterfacesAsync(false); ObjectInformation view = new ObjectInformation(m_reg, ent.Name, comObj, props, ent.Interfaces.Select(i => m_reg.MapIidToInterface(i.Iid)).ToArray()); Program.GetMainForm().HostControl(view); } } catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } }
private async Task SetupCLSIDNodeTree(TreeNode node, bool bRefresh) { COMCLSIDEntry clsid = null; if (node.Tag is COMCLSIDEntry) { clsid = (COMCLSIDEntry)node.Tag; } else if (node.Tag is COMProgIDEntry) { clsid = m_reg.MapClsidToEntry(((COMProgIDEntry)node.Tag).Clsid); } if (clsid != null) { node.Nodes.Clear(); TreeNode wait_node = new TreeNode("Please Wait, Populating Interfaces", InterfaceIcon, InterfaceIcon); node.Nodes.Add(wait_node); try { await clsid.LoadSupportedInterfacesAsync(bRefresh); if (clsid.Interfaces.Count() > 0) { node.Nodes.Remove(wait_node); foreach (COMInterfaceInstance ent in clsid.Interfaces) { node.Nodes.Add(CreateInterfaceNameNode(m_reg.MapIidToInterface(ent.Iid), ent)); } } else { wait_node.Text = "Error querying COM interfaces - Timeout"; } } catch (Win32Exception ex) { wait_node.Text = String.Format("Error querying COM interfaces - {0}", ex.Message); } } }
public async Task CreateInstanceFromCLSID(Guid clsid, CLSCTX clsctx, bool class_factory) { try { COMCLSIDEntry ent = null; Dictionary <string, string> props = new Dictionary <string, string>(); object comObj = null; string strObjName = ""; IEnumerable <COMInterfaceEntry> ints = null; if (m_registry.Clsids.ContainsKey(clsid)) { ent = m_registry.Clsids[clsid]; strObjName = ent.Name; props.Add("CLSID", ent.Clsid.FormatGuid()); props.Add("Name", ent.Name); props.Add("Server", ent.DefaultServer); await ent.LoadSupportedInterfacesAsync(false, null); if (class_factory) { comObj = ent.CreateClassFactory(); ints = ent.FactoryInterfaces.Select(i => m_registry.MapIidToInterface(i.Iid)); } else { comObj = ent.CreateInstanceAsObject(clsctx, null); ints = ent.Interfaces.Select(i => m_registry.MapIidToInterface(i.Iid)); } } else { Guid unk = COMInterfaceEntry.IID_IUnknown; IntPtr pObj; int hr; if (class_factory) { hr = COMUtilities.CoGetClassObject(ref clsid, clsctx, null, ref unk, out pObj); } else { hr = COMUtilities.CoCreateInstance(ref clsid, IntPtr.Zero, clsctx, ref unk, out pObj); } if (hr != 0) { Marshal.ThrowExceptionForHR(hr); } try { ints = m_registry.GetInterfacesForIUnknown(pObj).ToArray(); comObj = Marshal.GetObjectForIUnknown(pObj); strObjName = clsid.FormatGuid(); props.Add("CLSID", clsid.FormatGuid()); } finally { Marshal.Release(pObj); } } if (comObj != null) { /* Need to implement a type library reader */ Type dispType = COMUtilities.GetDispatchTypeInfo(this, comObj); HostControl(new ObjectInformation(m_registry, ent, strObjName, comObj, props, ints.ToArray())); } } catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }