2010-11-22 19 views
1

COMオブジェクトを動的に作成し、COMメソッドを呼び出してCOMプロパティを設定しようとしています。 COMクラスはVB6 ActiveX DLLです。実装はこのページのVB6コードと全く同じですhttp://msdn.microsoft.com/en-us/library/ms973800.aspx。短い言葉でCOMプロパティとメソッドを呼び出す

、プロジェクトがPhysServerで、クラス名は、二つの特性CelsiusFahrenheitと二つの方法GetCelsius()GetFahrenheit()を持ってTemperatureです。

私は既にregsvr32を実行して、ActiveX DLLをコンピュータに登録しています。 ProgIDはPhysServer.Temperatureです。

Iは

コードブロック1(作品)

Option Explicit Off 
Option Strict Off 
... 
Dim objType = Type.GetTypeFromProgID("PhysServer.Temperature") 
Dim comObj = Activator.CreateInstance(objType) 
comObj.Celsius = 100 
Dim f As Double = comObj.GetFahrenheit() 
Console.WriteLine(f) ' shows 212 

コードブロック2(作品)

Option Explicit On 
Option Strict On 
... 
Dim objType = Type.GetTypeFromProgID("PhysServer.Temperature") 
Dim comObj = Activator.CreateInstance(objType) 
Microsoft.VisualBasic.CallByName(comObj, "Celsius", CallType.Let, 100) 
Dim f As Double = CDbl(Microsoft.VisualBasic.CallByName(comObj, "GetFahrenheit", CallType.Method, Nothing)) 
Console.WriteLine(f) ' shows 212 

コード・ブロック3(doesnのコードの三個のブロックを有します't仕事)

Option Explicit On 
Option Strict On 
... 
Dim objType = Type.GetTypeFromProgID("PhysServer.Temperature") 
Dim comObj = Activator.CreateInstance(objType) 
Dim f As Double = CDbl(objType.InvokeMember("GetFahrenheit", Reflection.BindingFlags.InvokeMethod, Nothing, comObj, Nothing)) 
Console.WriteLine(f) ' shows the default value of GetFahrenheit ' 
objType.InvokeMember("Celsius", Reflection.BindingFlags.SetField Or Reflection.BindingFlags.InvokeMethod, Nothing, comObj, New Object() {100}) ' throws exception: Number of parameters specified does not match the expected number ' 
f = CDbl(objType.InvokeMember("GetFahrenheit", Reflection.BindingFlags.InvokeMethod, Nothing, comObj, Nothing)) 
Console.WriteLine(f) 

私はコードブロック1とコードブロック2を理解しています。しかし、どのようにコードブロック3のような反射を使用してCOMオブジェクトを設定できますか?何らかの理由で、私はコードブロック1とコードブロック2を使用できません。そのため、コードブロック3は唯一の方法ですが、動作しません。

誰もがコードブロック3の解決法を知っていますか?ありがとう!代わりにSetFieldの

objType.InvokeMember("Celsius", Reflection.BindingFlags.SetProperty Or ... 

答えて

1

はこれを試してみてください。

comObjはランタイム呼び出し可能なラッパーであり、摂氏はフィールドではなくそのプロパティです。

BindingFlags.Instanceフラグも指定する必要があります。

+0

RCWではなく、彼はレイトバインディングを使用しています。主はなぜそれを知っていますか? –

+0

ありがとうございました...インターネット上で解決策を見つけました。私の答えをお読みください。 –

+0

@Hans Passant:IDispatchを使用していても、それはまだRCWです。 –

関連する問題