Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Question
Thursday, May 27, 2010 7:22 PM | 1 vote
Is there a way to get ProgID of a component registered in the system from its type? I am trying to achieve something like the following
Type t = Type.GetTypeFromProgID("ProgId");
string progid = //somehow get the progID from the above type. Actually,i'll get an object of Type Object (which is like a wrapper for a ComObject) and from that i have to get the ProgID..
I tried the following
RegistrationServices reg = new RegistrationServices();
reg.GetProgIdForType(t);
and it threw an exception
Thanks
All replies (9)
Thursday, May 27, 2010 8:05 PM ✅Answered | 1 vote
Something like this might work:
[DllImport("ole32.dll")]
static extern int ProgIDFromCLSID([In] ref Guid clsid, [MarshalAs(UnmanagedType.LPWStr)] out string lplpszProgID);
. . .
object tmpComObj = Activator.CreateInstance(comType);
IPersist persist = comObj as IPersist;
if (persist != null)
{
Guid classId;
persist.GetClassID(out classId);
string progId;
ProgIDFromCLSID(ref classId, out progId);
Console.WriteLine("Progid = {0}, CLSID = {1}", progId, classId);
}
Marshal.ReleaseComObject(tmpComObj);
Tuesday, June 1, 2010 2:44 PM ✅Answered
You shouldn't have to reference anything - the COM interop DLL you already reference should have it defined. If for some reason you don't have it, you can manually add an interface to your project as follows :
using System;
using System.Runtime.InteropServices;
namespace Your-namespace-can-be-anything
{
[InterfaceType(1)]
[Guid("0000010C-0000-0000-C000-000000000046")]
public interface IPersist
{
void GetClassID(out Guid pClassID);
}
}
Thursday, May 27, 2010 8:31 PM
Hi Nishant,
Thanks for the reply..but i think i didnt make my requirement very clear..Hope you can help..What i need is from an object of type Object(which actually points toa Com Object) get the ProgID string..
for eg:
Type t = Type.GetTypeFromProgID("progID");
Object oj = Activator.CreateInstance(t);
would give me a Com Object wrapped..how would i get the ProgID from this Object?
Friday, May 28, 2010 2:02 PM
Yes, that's what I assumed you were asking about. In my example, that's what comType represents, a type that you obtained with a call to Type.GetTypeFromProgID(...).http://blog.voidnish.com
Tuesday, June 1, 2010 2:19 PM
Hi Nishant,
One final question.I see in MSDN that IPersist is part of microsoft.visualstudio.ole.interop.dll.And i searched the system for that and could not find the file to be added as referrence to the project.I am using VS2008 and XP.Could you please let me know about this. I tried adding the referrence using the "Browse" tab of "Add referrence" and it wont let me...Please advice..
Thanks
Wednesday, June 2, 2010 6:37 PM
Hi Nishant,
Thanks for the reply.Allow me to ask just one more question related to this.If from an object thats actually holding a referrence to a ComObject, is it possible for me to get the Memberinfo like the following?
IMyInterface intrf = comObj as IMyInterface;
MemberInfo[] minfo = intrf.GetType().GetMembers();
When i did this where comObj is of Type Object (__ComObject) i get only the methods of MarshallByRefObject class.How can i get the Members of the other interfaces that it implements?
TIA
Thursday, June 3, 2010 2:06 AM
When you do intrf.GetType() it returns the System.__ComObject type, but since you already know the interface you can simply do typeof(YourInterface). In your example above, that would be:
MemberInfo[] arr = typeof(IMyInterface).GetMembers();
Thursday, June 3, 2010 8:38 PM
Hi Nishant. But if i had a situation where i had a System.__ComObject and i wanted to query the interfaces it implemented and then get their members, how can i achieve it?
TIA
Friday, June 4, 2010 1:28 AM
I found C++ code to get the interfaces. Here is the C# translation:
public static List<string> GetInterfaces(object o)
{
IntPtr iUnknown = Marshal.GetIUnknownForObject(o);
List<string> list = new List<string>();
RegistryKey interfaceKey;
if (iUnknown != null && (interfaceKey = Registry.ClassesRoot.OpenSubKey("Interface")) != null)
{
foreach (string subKeyName in interfaceKey.GetSubKeyNames())
{
try
{
Guid clsID = new Guid(subKeyName);
IntPtr spObject;
if (Marshal.QueryInterface(iUnknown, ref clsID, out spObject) == 0)
{
RegistryKey subKey = interfaceKey.OpenSubKey(subKeyName);
list.Add((string)subKey.GetValue(""));
subKey.Close();
}
}
catch { }
}
interfaceKey.Close();
}
return list;
}