Вызов COM функций из С#
От: SCS  
Дата: 08.04.03 06:56
Оценка: 26 (3)
#Имя: FAQ.com.from.cs
есть некоторое дополение для вызова COM объектов — если вызываемый метод использует разные схемы передачи параметров, то необходимо построить массив ParameterModifier. документации на этот массив очень мало (если есть у кого ссылка, поделитесь, пожалуйста), но схема такая:
строится массив из одного элемента:
ParameterModifier[] pm=new ParameterModifier[1];
этот элемент описывает, как передавать параметы в метод
pm[0]=new ParameterModifier(3);
в этом примере 3 — количество передаваемых параметров:
pm[0][i]=true; // i-й параметр передается по ссылке (ByRef)
pm[0][i]=false; // i-й параметр передается по значению (ByVal)

законченный кусок кода — открытие ADODB connection, выполнение команды и закрытие.
Execute метод возвращает RecordsAffected, который нужно передать по ссылке
Type    ct=Type.GetTypeFromProgID("ADODB.Connection");
object  cn=Activator.CreateInstance(ct);
string  cs="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\temp\\db1.mdb;",
        user="Admin",
        pswd="",
        sqls="update [Table4] set mTx='56gh99'";
int     recs=0, opts=-1;

ct.InvokeMember("Open", BindingFlags.InvokeMethod, null, cn, new object[]{cs, user, pswd});

object[] pars=new Object[]{sqls, recs, opts};
  // список для передачи по ссылка/значение 
  // для COM всегда массив из одного элемента
  ParameterModifier[] pm=new ParameterModifier[1];
  // построить описатель передаваемых параметров 
  // в вызываемый метод: 3 параметра
  pm[0]=new ParameterModifier(3);
  pm[0][0]=false; // by val : ConnectionString
  pm[0][1]=true;  // by ref : RecordsAffected 
  pm[0][2]=false; // by val : Options
  ct.InvokeMember("Execute", BindingFlags.InvokeMethod, null, cn, pars, pm , null, null);
  recs=Convert.ToInt32(pars[1]);
                            
  ct.InvokeMember("Close", BindingFlags.InvokeMethod, null, cn, new object[]{});
  Marshal.ReleaseComObject(cn);
SCS
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.