powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / COM/DCOM
17 сообщений из 17, страница 1 из 1
COM/DCOM
    #32749182
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я знаю, что COM/DCOM технология устарела...
Но таково задание.
Надо достучаться до удаленной машины ("Raspupeny") и использовать некий COM/DCOM.
Как это делается на C#????
Т.е. достучаться кое как получается, но есть несколько проблем.
Как достукиваюсь.

Код: plaintext
1.
2.
3.
4.
Type TillType;
TillType = Type.GetTypeFromProgID("Wtdedit.FpAtl", "Raspupeny", true);
TillObject.COMObject = Activator.CreateInstance(TillType);
object[] InitObject = {911304495, "1", "9600"};
TillType.InvokeMember("OpenPort", BindingFlags.InvokeMethod, null, TillObject.COMObject, InitObject);

Вот теперь начинаются проблемы, надо передать в качестве параметра строку, в которую вернется какой-то текс.
Но как это сделать???

Код: plaintext
1.
2.
string ListValue = new string(' ', 150);
object[] SendObject1 = {488839203, ListValue};
TillType.InvokeMember("Send", BindingFlags.InvokeMethod, null, TillObject.COMObject, SendObject1, null, null, null);

Естественно в ListValue ничего не возвращается, но как тогда?
Согласно инструкции в одном из последних параметров можно задать ParameterModifier[] в котором соответствующие поля выстарить в pdIn, pdOut, pdLcid, pdRetval, pdOptional, and pdHasDefault соответственно.
Онять таки pdIn, pdOut, pdRetval и т.д. нигде де описаны.

И самое непонятное, есть функция которой не надо парамметров.
Типа ClosePort();
Код: plaintext
ReturnValue = (bool) TillType.InvokeMember("ClosePort", BindingFlags.InvokeMethod, null, TillObject.COMObject, null);

Ошибка...
Что делать????
Очень надо...
...
Рейтинг: 0 / 0
COM/DCOM
    #32749227
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСогласно инструкции в одном из последних параметров можно задать ParameterModifier[] попробуй:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ParameterModifier[] pm=new ParameterModifier[1];
pm[0]=new ParameterModifier(3);
pm[0][0]=false;  // by val : 488839203 
pm[0][1]=true;   // by ref : ListValue 

TillType.InvokeMember("Send", BindingFlags.InvokeMethod, null, TillObject.COMObject, SendObject1, pm, null, null);
ListValue=(string)SendObject1[1];
авторИ самое непонятное, есть функция которой не надо парамметров.попробуй указать массив нулевой длины
Код: plaintext
ReturnValue = (bool) TillType.InvokeMember("ClosePort", BindingFlags.InvokeMethod, null, TillObject.COMObject, new object[0]);
...
Рейтинг: 0 / 0
COM/DCOM
    #32749230
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исправлениеpm[0]=new ParameterModifier(2);
...
Рейтинг: 0 / 0
COM/DCOM
    #32749278
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кузяпопробуй указать массив нулевой длины
Код: plaintext
ReturnValue = (bool) TillType.InvokeMember("ClosePort", BindingFlags.InvokeMethod, null, TillObject.COMObject, new object[0]);
Ошибка: An unhandled exception of type 'System.NullReferenceException' occurred in FPScratch.exe
Additional information: Object reference not set to an instance of an object.

кузяParameterModifier[] pm=new ParameterModifier[1];
pm[0]=new ParameterModifier(3);
pm[0][0]=false; // by val : 488839203
pm[0][1]=true; // by ref : ListValue не помогло... :-((
Кстати это опечатка или именно так и надо было pm[0]=new ParameterModifier( 3 ); Зачем 3?

Пробовал даже так:
Код: plaintext
1.
2.
3.
4.
ParameterModifier[] pm=new ParameterModifier[2];
pm[0]=new ParameterModifier(1);
pm[1]=new ParameterModifier(1);
pm[0][0]=false;  // by val : 488839203 
pm[1][0]=true;  // by ref : ListValue
...
Рейтинг: 0 / 0
COM/DCOM
    #32749295
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 // строится массив [!всегда!] из одного элемента: 
ParameterModifier[] pm=new ParameterModifier[1];

 // этот элемент описывает, как передавать параметы в метод 
pm[0]=new ParameterModifier(2);

 // в твоем примере - 2 - количество передаваемых параметров: 

pm[0][0]=false;  // 0-й параметр передается по значению (ByVal) 
pm[0][1]=true; // 1-й параметр передается по ссылке (ByRef)
...
Рейтинг: 0 / 0
COM/DCOM
    #32749317
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
этот код у меня работает (просто др. примера с возвращаемыми параметрами нет под рукой)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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]);  // <--- ВОЗМОЖНО ЭТО ДЛЯ ТВОЕГО СЛУЧАЯ 'string' ДЕЛАТЬ НЕ НАДО  
                            
  ct.InvokeMember("Close", BindingFlags.InvokeMethod, null, cn, new object[]{});
  Marshal.ReleaseComObject(cn);

посмотри комментарий к 3-й строке снизу

здесь есть и вызов метода без параметров и передача параметра по ссылке
все типы передаваемых параметров заданы ЯВНО
...
Рейтинг: 0 / 0
COM/DCOM
    #32749319
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не помогает :-((
Такой вопрос, так как COM ждет строку, т.е. по большому счету дамп памяти.
А в C# string это объект, может проблема именно в этом?
как вообще выделить память и передать указатель на него?
...
Рейтинг: 0 / 0
COM/DCOM
    #32749327
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кузя, огромное спасибо...
Все заработало...
...
Рейтинг: 0 / 0
COM/DCOM
    #32749388
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AstakhovЯ знаю, что COM/DCOM технология устарела...
<OFF>
Ron Burk бывший главред WDJИстория программных революций от Microsoft, вкратце: Сначала были Windows API и DLL Hell. Революцией №1 было DDE – помните, как ссылки позволили нам создавать статусные строки, отражающие текущую цену акций Microsoft? Примерно тогда же Microsoft создала ресурс VERSION INFO, исключающий DLL Hell. Но другая группа в Microsoft нашла в DDE фатальный недостаток – его писали не они!

Для решения этой проблемы они создали OLE (похожее на DDE, но другое), и я наивно вспоминаю докладчика на Microsoft-овской конференции, говорящего, что скоро Windows API перепишут как OLE API, и каждый элемент на экране будет ОСХ-ом. В OLE появились интерфейсы, исключающие DLL Hell. Помните болезнь с названием «по месту», при которой мы мечтали встроить все свои приложения в один (возможно, очень большой) документ Word? Где-то в то же время Microsoft уверовала в религию С++, возникла MFC решившая все наши проблемы еще раз.

Но OLE не собиралась, сложа руки смотреть на это, поэтому оно заново родилось под именем COM, и мы внезапно поняли, что OLE (или это было DDE?) будет всегда – и даже включает тщательно разработанную систему версий компонентов, исключающую DLL Hell. В это время группа отступников внутри Microsoft обнаружила в MFC фатальный недостаток – его писали не они! Они немедленно исправили этот недочет, создав ATL, который как MFC, но другой, и попытались спрятать все замечательные вещи, которым так упорно старалась обучить нас группа COM. Это заставило группу COM (или это было OLE?) переименоваться в ActiveX и выпустить около тонны новых интерфейсов (включая интерфейсы контроля версий, исключающие DLL Hell), а заодно возможность сделать весь код загружаемым через броузеры, прямо вместе с определяемыми пользователем вирусами (назло этим гадам из ATL!).

Группа операционных систем громким криком, как забытый средний ребенок, потребовала внимания, сказав, что нам следует готовиться к Cairo, некой таинственной хреновине, которую никогда не могли даже толком описать, не то, что выпустить. К их чести, следует сказать, что они не представляли концепции «System File Protection», исключающей DLL Hell. Но тут некая группа в Microsoft нашла фатальный недостаток в Java - её писали не они! Это было исправлено созданием то ли J, то ли Jole, а может, и ActiveJ (если честно, я просто не помню), точно такого же как Java, но другого. Это было круто, но Sun засудило Microsoft по какому-то дряхлому закону. Это была явная попытка задушить право Microsoft выпускать такие же продукты, как у других, но другие.

Помните менеджера по J/Jole/ActiveJ, стучащего по столу туфлей и говорящего, что Microsoft никогда не бросит этот продукт? Глупец! Все это означало только одно – недостаток внимания к группе ActiveX (или это был COM?). Эта невероятно жизнерадостная толпа вернулась с COM+ и MTS наперевес (может, это стоило назвать ActiveX+?). Непонятно почему к MTS не приставили «COM» или «Active» или «X» или «+» – они меня просто потрясли этим! Они также грозились добавить + ко всем модным тогда выражениям. Примерно тогда же кое-кто начал вопить про «Windows DNA» (почему не DINA) и «Windows Washboard», и вопил некоторое время, но все это почило раньше, чем все поняли, что это было.

К этому моменту Microsoft уже несколько лет с нарастающей тревогой наблюдала за интернет. Недавно они пришли к пониманию, что у Интернет есть фатальный недостаток: ну, вы поняли. И это приводит нас к текущему моменту и технологии .NET (произносится как «doughnut (пончик по-нашему)», но по-другому), похожей на Интернет, но с большим количеством пресс- релизов. Главное, что нужно очень четко понимать - .NET исключает DLL Hell.

В .NET входит новый язык, C#, (выясняется, что в Active++ Jspresso был фатальный недостаток, от которого он и помер). .NET включает виртуальную машину, которую будут использовать все языки (видимо, из-за фатальных недостатков в процессорах Интел). .NET включает единую систему защиты (есть все-таки фатальный недостаток в хранении паролей не на серверах Microsoft). Реально проще перечислить вещи, которых .NET не включает. .NET наверняка революционно изменит Windows-программирование...
</OFF>
...
Рейтинг: 0 / 0
COM/DCOM
    #32749464
Фотография чингиз
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"учение билагейтса непобедимо, потому что оно верно."
Владимир Ильич Ленин. Антидюринг
...
Рейтинг: 0 / 0
COM/DCOM
    #32750399
Astakhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:-))
Здорово.
Я просто искал по форуму что-то относящееся к этой теме и спрашивал у знакомых. Все в один голос твердили одно и тоже.
Вот и пришлось написать, дабы пресечь критику и разглагольствования про то как COM/DCOM плохо и неудобно использовать...
...
Рейтинг: 0 / 0
COM/DCOM
    #32750466
Фотография nex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кузя, статейка - класс!! :D
...
Рейтинг: 0 / 0
COM/DCOM
    #32751000
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nexКузя, статейка - класс!! :D

Да, ещё раз с большим удовольствием перечитал :)
...
Рейтинг: 0 / 0
COM/DCOM
    #32751284
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помнится, я где то читал такую статейку на инглише :). Если не ошибаюсь, это было во введении к книге "Inside C#" ;)

Magnus
...
Рейтинг: 0 / 0
COM/DCOM
    #32751296
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[OFF]


Помнится, я где то читал такую статейку на инглише :). Если не ошибаюсь, это было во введении к книге "Inside C#" ;)

Навряд ли :-)
Inside C# - серьезная книга published by Microsoft Press. Читал книгу и статью эту не помню :-)

А статью куда? в FAQ ?

[/OFF]

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
COM/DCOM
    #32751315
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щас глянул, там точно нету. Что то другое было, я как всегда все путаю :).
Но в какой-то книге было.

Magnus
...
Рейтинг: 0 / 0
COM/DCOM
    #32752114
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
баян
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / COM/DCOM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]