Здравствуйте.
Мне нужно вызывать методы COM компонентов исползуя позднее связывание. Делаю таким образом
Type=Type.GetTypeFromProgID(...
Object=Activator.CreateInstance(..
В COM объекте хочу вызвать метод
HRESULT GetName([out]BSTR* bsName);
Как мне получить возвращаемую этим методом строку?
Здравствуйте, _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", ..) тебе и вернут
Здравствуйте, Аноним, Вы писали:
...
А>а через type.InvokeMember("GetName", ..) тебе и вернут
А как ее надо вызвать? Такой код не работает:
string result;
object[] params=new object[1];
params[0]=result;
Type.InvokeMethod("GetName", BindingFlags.InvokeMethod, null, params);
Чего то я не понимаю
Здравствуйте, _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[]{});
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, _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);
^^^^^^
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, _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[]{});
А>
И как догда быть в случае нескольких возвращаемых параметров?
Здравствуйте, _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
Здравствуйте, _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];
есть некоторое дополение для вызова 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);