.NET中如何在調用COM時得到返回參數值
2024-07-10 13:03:46
供稿:網友
在調用com組件接口的時候,我們一般使用type.invokemember()的方法來調用。type.invokemember()在調用的時候需要接受一個object類型的數組來傳遞接口的參數信息。對于那些僅僅包含有[in]或byval的接口參數,你只要構建這樣的數組,并把它傳給type.invokemember()即可。
如果com組件的接口參數含有[out]或者[in,out]返回參數(在vb開發的com組件里面是byref),那么,除了上面的做法之外,還得需要額外做一些工作。你必須得告訴type.invokemember()接口參數里面哪些參數是一個[in][in,out]或byref的參數,否則,你將得不到任何的返回參數值。為了得到[in][in,out]或byref返回參數的值,你得用到包含有parametermodifier數組的type.invokemember()重載方法。
parametermodifier數組中僅僅需要包含一個元素,parametermodifier對象有一個調用參數的索引屬性叫做item。在調用接口中,如果第n個參數是一個引用的參數,那么,第n個item屬性必須要賦值為true來告訴type.invokemember()這是一個引用的參數。
下面是一個調用包含有三個參數(其中兩個參數為引用參數)一個com的接口c#例子,在這個例子中,第二個參數和第三個參數都是引用的參數:
type comobjtype;
object comobj;
string returnvalue;
//創建com對象的引用
comobjtype = type.gettypefromprogid("somecomserver.somecomobject");
comobj = activator.createinstance(comobjtype);
//為invokemethod 的調用構建參數數組,并初始化每個參數元素
object[] paramarray = new object[3];
paramarray [0] = "inparam" ;
paramarray[1] = 5 ;
paramarray[2] = "" ;
//構建parametermodifier數組(注意上面所說的parametermodifier數組里面只有一個元素)
//這里有三個參數。所以在創建parametermodifier對象的時候要在其構造函數里面指出參數的個數
//用參數的索引屬性來指出哪些參數是一個返回的參數
//對于那些是[in]或byref的參數可以不用指定
parametermodifier[] parammods = new parametermodifier [1];
parammods[0] = new parametermodifier (3); // 初始化為接口參數的個數
parammods[0][1] = true; // 設置第二個參數為返回參數
parammods[0][2] = true; // 設置第三個參數為返回參數
//調用含有parametermodifier數組的重載函數
returnvalue = (string) comobjtype.invokemember("returnsomevalues", // 接口函數名
bindingflags.default | bindingflags.invokemethod,
null,
comobj, // 調用的com組件
paramarray, // 參數數組
parammods, // 指定返回參數的parametermodifier數組
null,
null) ;
//顯示參數的值
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數組,你必須在接受返回的參數數組中初始化參數的數據類型。在上面的例子中,第二個參數是整形[5],第三個參數是文本['']。