.NET中如何在調(diào)用COM時(shí)得到返回參數(shù)值
.NET中如何在調(diào)用COM時(shí)得到返回參數(shù)值
在調(diào)用COM組件接口的時(shí)候,我們一般使用Type.InvokeMember()的方法來(lái)調(diào)用。Type.InvokeMember()在調(diào)用的時(shí)候需要接受一個(gè)Object類(lèi)型的數(shù)組來(lái)傳遞接口的參數(shù)信息。對(duì)于那些僅僅包含有[in]或ByVal的接口參數(shù),你只要構(gòu)建這樣的數(shù)組,并把它傳給Type.InvokeMember()即可。
如果COM組件的接口參數(shù)含有[out]或者[in,out]返回參數(shù)(在VB開(kāi)發(fā)的COM組件里面是ByRef),那么,除了上面的做法之外,還得需要額外做一些工作。你必須得告訴Type.InvokeMember()接口參數(shù)里面哪些參數(shù)是一個(gè)[in][in,out]或ByRef的參數(shù),否則,你將得不到任何的返回參數(shù)值。為了得到[in][in,out]或ByRef返回參數(shù)的值,你得用到包含有ParameterModifier數(shù)組的Type.InvokeMember()重載方法。
ParameterModifier數(shù)組中僅僅需要包含一個(gè)元素,ParameterModifier對(duì)象有一個(gè)調(diào)用參數(shù)的索引屬性叫做Item。在調(diào)用接口中,如果第N個(gè)參數(shù)是一個(gè)引用的參數(shù),那么,第N個(gè)Item屬性必須要賦值為true來(lái)告訴Type.InvokeMember()這是一個(gè)引用的參數(shù)。
下面是一個(gè)調(diào)用包含有三個(gè)參數(shù)(其中兩個(gè)參數(shù)為引用參數(shù))一個(gè)COM的接口C#例子,在這個(gè)例子中,第二個(gè)參數(shù)和第三個(gè)參數(shù)都是引用的參數(shù):
type ComObjType;object ComObj;string ReturnValue;
//創(chuàng)建COM對(duì)象的引用ComObjType = Type.GetTypeFromProgID("SomeComServer.SomeComObject"); ComObj = Activator.CreateInstance(ComObjType);
//為InvokeMethod 的調(diào)用構(gòu)建參數(shù)數(shù)組,并初始化每個(gè)參數(shù)元素object[] ParamArray = new object[3]; ParamArray [0] = "InParam" ; ParamArray[1] = 5 ;ParamArray[2] = "" ; //構(gòu)建ParameterModifier數(shù)組(注意上面所說(shuō)的ParameterModifier數(shù)組里面只有一個(gè)元素)//這里有三個(gè)參數(shù)。所以在創(chuàng)建ParameterModifier對(duì)象的時(shí)候要在其構(gòu)造函數(shù)里面指出參數(shù)的個(gè)數(shù) //用參數(shù)的索引屬性來(lái)指出哪些參數(shù)是一個(gè)返回的參數(shù)//對(duì)于那些是[in]或ByRef的參數(shù)可以不用指定ParameterModifier[] ParamMods = new ParameterModifier [1]; ParamMods[0] = new ParameterModifier (3); // 初始化為接口參數(shù)的個(gè)數(shù)ParamMods[0][1] = true; // 設(shè)置第二個(gè)參數(shù)為返回參數(shù)ParamMods[0][2] = true; // 設(shè)置第三個(gè)參數(shù)為返回參數(shù)//調(diào)用含有ParameterModifier數(shù)組的重載函數(shù)ReturnValue = (string) ComObjType.InvokeMember("ReturnSomeValues", // 接口函數(shù)名 BindingFlags.Default | BindingFlags.InvokeMethod, null, ComObj, // 調(diào)用的COM組件 ParamArray, // 參數(shù)數(shù)組 ParamMods, // 指定返回參數(shù)的ParameterModifier數(shù)組 null, null) ;
//顯示參數(shù)的值Console.WriteLine ("Param1 = {0}", ParamArray[0]) ; Console.WriteLine ("Param2 = {0}", ParamArray[1]) ; Console.WriteLine ("Param3 = {0}", ParamArray[2]) ; Console.WriteLine ("Return Value = {0}", ReturnValue ) ;
注意,為了給InvokeMethod()傳遞正確的ParameterModifier數(shù)組,你必須在接受返回的參數(shù)數(shù)組中初始化參數(shù)的數(shù)據(jù)類(lèi)型。在上面的例子中,第二個(gè)參數(shù)是整形[5],第三個(gè)參數(shù)是文本[']。