.NET ( ) のオートメーション API を使用して、自分で生成System.Runtime.InteropServices.ComTypes
したタイプ ライブラリを調べています (Bar.tlb
以下を参照)。このタイプ ライブラリは、インポートされたタイプ ライブラリで定義されているインターフェイスIBar
を継承するインターフェイスを宣言します。表現を検査すると、例外が発生します。(コードは以下に続きます。)IFoo
Foo.tlb
ITypeInfo
IBar
コードに入る前に、Bar.tlb
タイプ ライブラリを生成する方法を次に示します。
Bar.idl:
[uuid(32E81FDD-BCB0-481B-AD3C-3ED04BFA7D1F)]
library Bar
{
importlib("Foo.tlb");
[uuid(CF062BE8-86D2-4D9B-8D1D-D889A77DA876)]
interface IBar : IFoo { };
}
Foo.idl:
[uuid(22E81FDD-BCB0-481B-AD3C-3ED04BFA7D1E)]
library Foo
{
importlib("stdole32.tlb");
[uuid(BF062BE8-86D2-4D9B-8D1D-D889A77DA875)]
interface IFoo : IUnknown { };
}
次のコマンドを使用して両方の IDL ファイルをコンパイルしましたが、エラーや警告なしで成功しました。
midl.exe /mktyplib203 /env win32 /i … /tlb Foo.tlb Foo.idl
midl.exe /mktyplib203 /env win32 /i … /tlb Bar.tlb Bar.idl
今私がやろうとしていることはこれです:
using System.Runtime.InteropServices;
using ITypeLib = System.Runtime.InteropServices.ComTypes.ITypeLib;
using ITypeInfo = System.Runtime.InteropServices.ComTypes.ITypeInfo;
static class Program
{
[DllImport("oleaut32.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
static extern ITypeLib LoadTypeLibEx(string path, REGKIND regkind);
enum REGKIND { REGKIND_NONE = 2 }
public static void Main()
{
ITypeLib typeLib = LoadTypeLibEx(@"C:\Path\To\Bar.tlb", REGKIND.REGKIND_NONE);
ITypeInfo typeInfo;
typeLib.GetTypeInfo(0, out typeInfo);
IntPtr typeAttrPtr;
typeInfo.GetTypeAttr(out typeAttrPtr); //! COMException: TYPE_E_CANTLOADLIBRARY
… // (HRESULT 0x80029c4a)
}
}
でマークされた行で例外がスローされ//!
ます。検査対象ITypeInfo
はIBar
インターフェイス用です。
オートメーション API が継承されたインターフェイスを見つけるのに問題があるに違いないことを理解していますIFoo
。これは、登録されていない別のタイプ ライブラリに含まれています。
Bar.tlb
しかし、どうやらそれはとにかく検査することが可能であるべきです。OleView.exe
うまく管理します:
(はい、外部タイプ ライブラリのファイル名を再構築できないという警告が表示されます。これは、 を登録していないためですFoo.tlb
。それは私が心配していることではありません。)
OleView.exe
クラッシュせずに検査できる場合IBar
、コードがクラッシュするのはなぜtypeInfo.GetTypeAttr()
ですか? これを修正するにはどうすればよいですか?