我一直在谷歌上搜索,试图找到获取COM接口实例的标准方法。
Microsoft在他们的文章COM Interop Part 1: Client Tutorial中提供了一个示例:
然而,看起来他们正在实例化一个COM对象并将其强制转换为COM接口。
对于我感兴趣的接口“IDesktopWallpaper”,似乎没有可实例化的实现COM对象。
我找到的一个示例here定义了一些类,该类被实例化,然后以与msdn示例相同的方式将其强制转换为接口。
我不理解实例化对象是什么。它似乎是一个任意的对象,它有一个
另一个例子在这里找到,使用
这种方法似乎是请求一个现有接口实例的指针。在Windows Shell文档中,我找不到任何类似于
问题:
简而言之,获取COM接口实例的标准方式是什么?
如果没有通用解决方案,那么人们可以使用哪些标准方法来获取COM接口实例,并在什么情况下使用每种方法最有用?
Microsoft在他们的文章COM Interop Part 1: Client Tutorial中提供了一个示例:
// Create an instance of a COM coclass:
FilgraphManager graphManager = new FilgraphManager();
// See if it supports the IMediaControl COM interface.
// Note that this will throw a System.InvalidCastException if
// the cast fails. This is equivalent to QueryInterface for
// COM objects:
IMediaControl mc = (IMediaControl) graphManager;
// Now you call a method on a COM interface:
mc.Run();
然而,看起来他们正在实例化一个COM对象并将其强制转换为COM接口。
对于我感兴趣的接口“IDesktopWallpaper”,似乎没有可实例化的实现COM对象。
我找到的一个示例here定义了一些类,该类被实例化,然后以与msdn示例相同的方式将其强制转换为接口。
[ComImport, Guid("C2CF3110-460E-4fc1-B9D0-8A1C0C9CC4BD")]
internal class IDesktopWallpaper
{
}
[Guid("B92B56A9-8B55-4E14-9A89-0199BBB6F93B"), //B92B56A9-8B55-4E14-9A89-0199BBB6F93B
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface DesktopWallpaperInterface
{
// declared members
}
我不理解实例化对象是什么。它似乎是一个任意的对象,它有一个
GuidAttribute
,这似乎表明它是一个真正的COM对象。另一个例子在这里找到,使用
System.Type
和System.Runtime.InteropServices.Marshal
来实例化对象,然后将其转换为接口。IntPtr ptrRet;
SHGetMalloc(out ptrRet);
System.Type mallocType = System.Type.GetType("IMalloc");
Object obj = Marshal.GetTypedObjectForIUnknown(ptrRet,mallocType);
IMalloc pMalloc = (IMalloc)obj;
这种方法似乎是请求一个现有接口实例的指针。在Windows Shell文档中,我找不到任何类似于
SHGetMalloc
用于IDesktopWallpaper
的方法。问题:
简而言之,获取COM接口实例的标准方式是什么?
如果没有通用解决方案,那么人们可以使用哪些标准方法来获取COM接口实例,并在什么情况下使用每种方法最有用?
在下载了Windows 10 SDK并参考IDesktopWallpaper接口文档的要求部分后,我发现你可以查找Shobjidl.h
中的MIDL,并将其用于接口声明中的GuidAttribute
,然后查找Shobjidl.idl
中的CLSID,并与Type.GetTypeFromCLSID(Guid)
和Activator.CreateInstance(Type)
一起使用,以获取实现IDesktopWallpaper
的对象的实例。
我现在也看到CLSID是上述第二种方法中似乎任意对象的GuidAttribute
所使用的。这种方法似乎允许您通过实例化类,然后将实例强制转换为COM接口来模拟托管实例化对象。
然而,我仍然想知道这是否是最好的方法以及与其他方法相比可能存在的优缺点。