2015/11/09(Mon) 18:32:06 編集(投稿者)
coclass の ITypeInfo から GetRefTypeOfImplType(), GetRefTypeInfo() を順に呼ぶことで、
coclass が実装しているインターフェースの ITypeInfo を取得することができます。
※以下、coclass の ITypeInfo がある(TYPEATTR.typekind == TKIND_COCLASS)という前提の話です。
C++ が読めるなら、
http://yanaware.com/com4me/typeinfo2.php-author=Sean%20BAXTER&mail=spec@ript.net&url=http---ript.net-~spec-&idTute=13.htm
の一番下のサンプルコードが参考になります。
上記 URL のサンプルコードを C# に変換すると以下のような感じかと思います。
一応動作確認済みです。
(C# には不慣れなので変なところがあるのはご容赦ください)
using System;
using System.Runtime.InteropServices;
using ComTypes = System.Runtime.InteropServices.ComTypes;
namespace typetest
{
class Program
{
[DllImport("oleaut32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern int LoadTypeLib(string fileName, out ComTypes.ITypeLib typeLib);
static void Main(string[] args)
{
ComTypes.ITypeLib pTypeLib;
int hr = LoadTypeLib(@"C:\Windows\System32\Shdocvw.dll", out pTypeLib);
if (hr != 0)
{
throw new ExternalException("LoadTypeLib", hr);
}
int infoCount = pTypeLib.GetTypeInfoCount();
for (int curCoClass = 0; curCoClass < infoCount; ++curCoClass)
{
ComTypes.TYPEKIND typeKind;
pTypeLib.GetTypeInfoType(curCoClass, out typeKind);
if (typeKind != ComTypes.TYPEKIND.TKIND_COCLASS)
{
continue;
}
string coClassName, docString, helpFile;
int helpContext;
pTypeLib.GetDocumentation(curCoClass, out coClassName, out docString, out helpContext, out helpFile);
Console.WriteLine("{0}:", coClassName);
ComTypes.ITypeInfo pTypeInfo;
pTypeLib.GetTypeInfo(curCoClass, out pTypeInfo);
IntPtr typeAttr_;
pTypeInfo.GetTypeAttr(out typeAttr_);
try
{
ComTypes.TYPEATTR typeAttr =
(ComTypes.TYPEATTR)Marshal.PtrToStructure(typeAttr_, typeof(ComTypes.TYPEATTR));
// ここからがポイント
for (int curInterface = 0; curInterface < typeAttr.cImplTypes; ++curInterface)
{
int hRefType;
pTypeInfo.GetRefTypeOfImplType(curInterface, out hRefType);
ComTypes.ITypeInfo pInterfaceInfo;
pTypeInfo.GetRefTypeInfo(hRefType, out pInterfaceInfo);
string interfaceName;
pInterfaceInfo.GetDocumentation(-1, out interfaceName, out docString, out helpContext, out helpFile);
Console.WriteLine("\t{0}", interfaceName);
}
// ここまでがポイント
}
finally
{
pTypeInfo.ReleaseTypeAttr(typeAttr_);
}
}
}
}
}
ポイントと書いた箇所のようなループを作り、ループ内で pInterfaceInfo が
目的のインターフェースを示しているかを何かしらの方法でチェックすればよいかと思います。
(例えば TYPEATTR を取得して guid が目的のインターフェースの GUID と一致するかを調べる、とか)