Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.057 c
1-1136953843
иосиф
2006-01-11 07:30
2006.02.12
Советы по оптимизации - 1


15-1137904711
AllinBDA
2006-01-22 07:38
2006.02.12
Компоненты или заголовки для Фиксального Регистра. "Феликс 3СК"


2-1137794570
Лом
2006-01-21 01:02
2006.02.12
case of


2-1138217195
Dlg
2006-01-25 22:26
2006.02.12
Как в MessageDlg сделать, что бы в фокусе ввода была кнопка No ?


1-1137063029
Ega23
2006-01-12 13:50
2006.02.12
Как узнать ParentFont?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский