COMオブジェクトを動的に作成し、COMメソッドを呼び出してCOMプロパティを設定しようとしています。 COMクラスはVB6 ActiveX DLLです。実装はこのページのVB6コードと全く同じですhttp://msdn.microsoft.com/en-us/library/ms973800.aspx。短い言葉でCOMプロパティとメソッドを呼び出す
、プロジェクトがPhysServer
で、クラス名は、二つの特性Celsius
とFahrenheit
と二つの方法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 ...
:
RCWではなく、彼はレイトバインディングを使用しています。主はなぜそれを知っていますか? –
ありがとうございました...インターネット上で解決策を見つけました。私の答えをお読みください。 –
@Hans Passant:IDispatchを使用していても、それはまだRCWです。 –