Вызов COM функций из С#
От: _Kostya_  
Дата: 07.04.03 14:08
Оценка:
Здравствуйте.

Мне нужно вызывать методы COM компонентов исползуя позднее связывание. Делаю таким образом
Type=Type.GetTypeFromProgID(... 
Object=Activator.CreateInstance(..


В COM объекте хочу вызвать метод
HRESULT GetName([out]BSTR* bsName);

Как мне получить возвращаемую этим методом строку?
Re: Вызов COM функций из С#
От: Аноним  
Дата: 07.04.03 14:12
Оценка:
Здравствуйте, _Kostya_, Вы писали:

K>Здравствуйте.


K>Мне нужно вызывать методы COM компонентов исползуя позднее связывание. Делаю таким образом

K>
K>Type=Type.GetTypeFromProgID(... 
K>Object=Activator.CreateInstance(.. 
K>


K>В COM объекте хочу вызвать метод

K>HRESULT GetName([out]BSTR* bsName);

K>Как мне получить возвращаемую этим методом строку?


а через type.InvokeMember("GetName", ..) тебе и вернут
Re[2]: Вызов COM функций из С#
От: _Kostya_  
Дата: 07.04.03 14:28
Оценка:
Здравствуйте, Аноним, Вы писали:

...

А>а через type.InvokeMember("GetName", ..) тебе и вернут


А как ее надо вызвать? Такой код не работает:

string result;
object[] params=new object[1];
params[0]=result;
Type.InvokeMethod("GetName", BindingFlags.InvokeMethod, null, params);


Чего то я не понимаю
Re[3]: Вызов COM функций из С#
От: Аноним  
Дата: 07.04.03 14:35
Оценка:
Здравствуйте, _Kostya_, Вы писали:

примерно так
Type   tp =Type.GetTypeFromProgID("Word.Applivation");
oblect ob =Activator.CreateInstance(t);
object res=tp.InvokeMember("GetName", BindingFlags.Public | BindingFlags.InvokeMethod, null, ob, new object[]{});
Re[4]: Вызов COM функций из С#
От: _Kostya_  
Дата: 07.04.03 14:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, _Kostya_, Вы писали:


А>примерно так

А>
А>Type   tp =Type.GetTypeFromProgID("Word.Applivation");
А>oblect ob =Activator.CreateInstance(t);
А>object res=tp.InvokeMember("GetName", BindingFlags.Public | BindingFlags.InvokeMethod, null, ob, new object[]{});
А>


Но в этом случае COM метод нужно описать по другому?

HRESULT GetName([out, retval]BSTR* bsName);
                      ^^^^^^
Re[4]: Вызов COM функций из С#
От: _Kostya_  
Дата: 07.04.03 14:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, _Kostya_, Вы писали:


А>примерно так

А>
А>Type   tp =Type.GetTypeFromProgID("Word.Applivation");
А>oblect ob =Activator.CreateInstance(t);
А>object res=tp.InvokeMember("GetName", BindingFlags.Public | BindingFlags.InvokeMethod, null, ob, new object[]{});
А>


И как догда быть в случае нескольких возвращаемых параметров?
Re[5]: Вызов COM функций из С#
От: Аноним  
Дата: 07.04.03 15:19
Оценка:
Здравствуйте, _Kostya_, Вы писали:

K>И как догда быть в случае нескольких возвращаемых параметров?


a) для С# написать свой Binder
б) использовать VB.Net
Re[5]: Вызов COM функций из С#
От: Mika Soukhov Stock#
Дата: 07.04.03 15:32
Оценка:
Здравствуйте, _Kostya_, Вы писали:

K>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, _Kostya_, Вы писали:


А>>примерно так

А>>
А>>Type   tp =Type.GetTypeFromProgID("Word.Applivation");
А>>oblect ob =Activator.CreateInstance(t);
А>>object res=tp.InvokeMember("GetName", BindingFlags.Public | BindingFlags.InvokeMethod, null, ob, new object[]{});
А>>


K>И как догда быть в случае нескольких возвращаемых параметров?


ParameterModifier
Re[5]: Вызов COM функций из С#
От: SCS  
Дата: 08.04.03 05:19
Оценка:
Здравствуйте, _Kostya_, Вы писали:
K>И как догда быть в случае нескольких возвращаемых параметров?

все аргументы (входные и выходные) — в массиве параметров
object[] args=new object[]{ par1, par2, par3 };
tp.InvokeMember("GetName", BindingFlags.Public | BindingFlags.InvokeMethod, null, ob, args);
// и для всех параметров out и ref достаём из массива
par1=args[0];
par2=args[1];
par3=args[2];
SCS
Вызов 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...
Пока на собственное сообщение не было ответов, его можно удалить.