Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Thread u Com   Найти похожие ветки 

 
kblc ©   (2005-11-28 13:00) [0]

Уважаемые мастера, почему у меня не работает слудующий код:
У меня есть COM сервере который имеет интерфейс IIntf1;
Почему же не работает след:

procedure proc1;
var
 i1L IIntf1;
begin
 CoInitialize(nil);
 try
   IIntf:=CreateComObject(ProgIDToClassID("srv.serv")) as IINtf1;
   // exception: Iterface no supported;
 finally
   CoUninitialize;
 end;
end;

begin
 CreateThread(...., @proc1, ....);
 .....
end;


Если тоже самое ( IIntf := CreateComObject( ProgIDToClassID("srv.serv")) as IINtf1;) сделать в форме, то всё прекрасно работает?

Будьте добры - подскажите...


 
Digitman ©   (2005-11-28 13:15) [1]


> Почему же не работает след


неужели так и говорит, мол,  "не работаю" ?


 
kblc ©   (2005-11-28 15:13) [2]

По моему я дописал:
 try
  IIntf:=CreateComObject(ProgIDToClassID("srv.serv")) as IINtf1;
  // exception: Iterface no supported;
finally
  CoUninitialize;
end;


 
Digitman ©   (2005-11-28 15:23) [3]

тогда рассказывай, что такое "сделать в форме" ..

ибо "форма" и "thread" далеки друг от друга как "в огороде бузина" от "в Киеве дядька"


 
Leonid Troyanovsky ©   (2005-11-28 15:26) [4]


> kblc ©   (28.11.05 15:13) [2]
> По моему я дописал:

>   // exception: Iterface no supported;


Вот, когда, например, я изображаю из себя компилятор,
то также игнорирую комментарии.

Т.е., место возникновения ошибки можно было бы обозначить
поясней (тем более, что приведенный код не компилировался,
см., например, var i1L IIntf1).

Ну, а вообще-то, для начала RTFM: Delphi help: BeginThread.

--
Regards, LVT.


 
kblc ©   (2005-11-28 15:30) [5]

я имел ввиду повторить код
 try
  IIntf:=CreateComObject(ProgIDToClassID("srv.serv")) as IINtf1;
  // exception: Iterface no supported;
finally
  CoUninitialize;
end;

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


 
kblc ©   (2005-11-28 15:35) [6]

Leonid Troyanovsky ©   (28.11.05 15:26) [4]
Прошу прощения за код - писал ручками, торопился.

Мануал читаю.. пока не до конца въехал...


 
Digitman ©   (2005-11-28 16:00) [7]


> имел ввиду повторить код
> в любом обработчике формы


ну так и говори - мол, в основном кодовом потоке процесса что-то там работает, а в дополнительном кодовом потоке то же самое "что-то" не работает по неизвестным мне причинам, с такой-то диагностикой ошибки/исключения в таком-то месте на такой-то строчке моего кода ..

поясни В КОДЕ, на основании чего ты сделал умозаключение насчет Iterface no supported..


 
kblc ©   (2005-11-28 16:40) [8]


var
 GUID: TGIUD;
begin
CoInitialize(nil);
try
 GUID:=ProgIDToClassID("srv.serv");
 IIntf:=CreateComObject(GUID) as IINtf1;  // <- вот на этой строчке появляется exception "Interface not supported".
finally
 CoUninitialize;
end;

а если использовать объект оле, например
cVariant:=CreateOleObject("Word.Application"); cVariant.Open(...);, то всё работает.
Насколько я понимаю проблема в самой реализации интерфейса. У меня при инициализации фабрики след. параметры:
ThreadingModel = tmApartment;
ClassInstance = ciSingleInstance;


П.С.
BeginThread не помогло... :(


 
Leonid Troyanovsky ©   (2005-11-28 17:01) [9]


> kblc ©   (28.11.05 16:40) [8]

> BeginThread не помогло... :(


Чему не помогло?

--
Regards, LVT.


 
Digitman ©   (2005-11-28 17:15) [10]


> вот на этой строчке появляется exception "Interface not
> supported".


как узнал ?


 
Набережных С. ©   (2005-11-28 20:44) [11]

Собственно, эта ошибка возвращается в двух случаях - либо у объекта действительно нет запрошенного интерфейса, либо этот интерфейс невозможно маршалировать в апартамент потока из-за отсутствия в системе Proxy/Stub для него.


 
kblc ©   (2005-11-29 07:28) [12]

Набережных С., можно поподробнее на счёт "интерфейс невозможно маршалировать в апартамент потока из-за отсутствия в системе Proxy/Stub для него.", потому как интерфейс действительно поддерживается.


 
kblc ©   (2005-11-29 07:29) [13]

Digitman, узнал это пользуясь отладчиком. хм.. есть другие способы?


 
Digitman ©   (2005-11-29 08:14) [14]

т.е. ты утверждаешь что

var Unk: IUnknown;
    Intf: IIntf1;
..
  Intf:=CreateComObject(ProgIDToClassID("srv.serv"));
  Intf:= Unk as IIntf1; // <- исключение возбуждается именно здесь ?
..


 
kblc ©   (2005-11-29 10:43) [15]

var Unk: IUnknown;
   Intf: IIntf1;
..
 Unk:=CreateComObject(ProgIDToClassID("srv.serv"));
 Intf:= Unk as IIntf1; // <- исключение возбуждается именно здесь ?
..

В том то и дело что ИМЕННО ТАМ!!!!


 
Digitman ©   (2005-11-29 11:29) [16]

а трэдинг-модель какая у фабрики ?


 
Набережных С. ©   (2005-11-29 11:51) [17]

Для того, чтобы интерфейсную ссылку можно было передать через границу апартаментов существует механизм маршалинга. Для каждого интерфейса в системе регистрируются размещенные в ДЛЛ специальные объекты, называемые Proxy and Stub. Если интерфейс использует в методах только Ole-совместимые типы, для него есть библиотека типов и он соответствующим образом зарегистрирован, то в качестве Proxy/Stub для него может быть использован универсальный маршалер из OleAut32. В противном случае это должны быть специально для него написанные объекты. Прокси создается подсистемой СОМ в апартаменте клиента, и именно его интерфейс получает клиент. Стаб размещается в апартаменте самого объекта и содержит ссылку на соответствующий интерфейс этого объекта.

Когда клиент вызывает метод объекта, реально он вызывает метод прокси. Внутри него прокси упаковывает параметры метода в пакет и отправляет этот пакет по каналу связи в апартамент объекта. Там пакет поступает к парному стабу. Тот распаковывает параметры и производит вызов собственно метода объекта, после этого упаковывает ответные данные и отправляет их прокси, а та уже передает их клиенту.

Соответственно, если при попытке установить связь СОМ не находит для интерфейса Proxy/Stub, она извещает о невозможности установления связи возвратом кода E_NOINTERFACE. И я не помню, чтобы СОМ возвращала такую ошибку еще в каких-то случаях, кроме мной указанных в [11].

Повторю, все это имеет место только тогда, когда COM-объект и его клиент находятся в разных апартаментах. В одном апартаменте вся работа идет напрямую.

Более развернуто это все описано в MSDN. Или, например, у Дона Бокса, в книге "Сущность технологии COM"


 
kblc ©   (2005-11-29 12:04) [18]

2 Digitman: kblc ©   (28.11.05 16:40) [8]


 
Набережных С. ©   (2005-11-29 12:16) [19]

Для того, чтобы интерфейсную ссылку можно было передать через границу апартаментов существует механизм маршалинга. Для каждого интерфейса в системе регистрируются размещенные в ДЛЛ специальные объекты, называемые Proxy and Stub. Если интерфейс использует в методах только Ole-совместимые типы, для него есть библиотека типов и он соответствующим образом зарегистрирован, то в качестве Proxy/Stub для него может быть использован универсальный маршалер из OleAut32. В противном случае это должны быть специально для него написанные объекты. Прокси создается подсистемой СОМ в апартаменте клиента, и именно его интерфейс получает клиент. Стаб размещается в апартаменте самого объекта и содержит ссылку на соответствующий интерфейс этого объекта.

Когда клиент вызывает метод объекта, реально он вызывает метод прокси. Внутри него прокси упаковывает параметры метода в пакет и отправляет этот пакет по каналу связи в апартамент объекта. Там пакет поступает к парному стабу. Тот распаковывает параметры и производит вызов собственно метода объекта, после этого упаковывает ответные данные и отправляет их прокси, а та уже передает их клиенту.

Соответственно, если при попытке установить связь СОМ не находит для интерфейса Proxy/Stub, она извещает о невозможности установления связи возвратом кода E_NOINTERFACE. И я не помню, чтобы СОМ возвращала такую ошибку еще в каких-то случаях, кроме мной указанных в [11].

Повторю, все это имеет место только тогда, когда COM-объект и его клиент находятся в разных апартаментах. В одном апартаменте вся работа идет напрямую.

Более развернуто это все описано в MSDN. Или, например, у Дона Бокса, в книге "Сущность технологии COM"


 
Набережных С. ©   (2005-11-29 12:22) [20]

Прошу прощения за дубль. Даже не понял, как оно получилось:(



Страницы: 1 вся ветка

Текущий архив: 2006.02.12;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.045 c
2-1137866881
BackGround
2006-01-21 21:08
2006.02.12
WinMain


3-1134296910
SnapIn
2005-12-11 13:28
2006.02.12
Как отобразить OLE-поле из таблицы Access?


2-1138173689
emergency
2006-01-25 10:21
2006.02.12
Литература по работе с сетями


4-1132821441
kolos_rus
2005-11-24 11:37
2006.02.12
Залогинился юзер или нет.


1-1136897933
m_mike
2006-01-10 15:58
2006.02.12
Программа мешает завершению работы windows