Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Требуется помощь по IConnectionPointContainer [Delphi, Windows]


AbrosimovA ©   (2005-07-06 11:31:00) 

Я решил в познавательных целях позаниматься вопросом создания OPC клиента для WinCC 5.0. Не понимаю как получить ссылку на интерфейс   IConnectionPointContainer. К серверу OPCServer.WinCCя подключаюсь нормально; удаётся прочитать дерево элементов из проекта WinCC, но дальше мне нужно получить информацию (например, тип и значение) каждого тэга. Так вот для этого мне нужен IConnectionPointContainer.


k2   (2005-07-14 03:38:00) [1]

AbrosimovA   (13.07.05 14:32)
Пример был-бы кстати.


лучше по линку пойти, там много интересного


AbrosimovA   (2005-07-13 14:32:00) [2]

Пример был-бы кстати.


k2   (2005-07-13 12:11:00) [3]

может быть полезен пример модуля SinkObject от Бина Ли
http://www.techvanguards.com


Forester   (2005-07-12 14:17:00) [4]

Sorry!

1) получения извещения о закрытии сервера через callback интерфейс IOPCSShutdown (OPC Server object)

читать как

1) передачи извещения клиенту о закрытии сервера через callback интерфейс IOPCSShutdown (OPC Server object)


Forester   (2005-07-12 14:16:00) [5]

IConnectionPointContainer используется в сервере для
1) получения извещения о закрытии сервера через callback интерфейс IOPCSShutdown (OPC Server object)
2) для передачи данных через IOPCDataCallBack (OPC Group Object)

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

TClientDA2 = class(TComponent, IOPCShutdown, IOPCDataCallBack)
 private
  ...
  FSrvConnection:integer; // идентификатор подключения
  ...

 protected
  // Процедура подписывает клиент на запрос об отключении cервера
   procedure AdviseClient;

 ...

implementation
 procedure TClientDA2.AdviseClient;
var
 ConnectionPointContainer: IConnectionPointContainer;
 ConnectionPoint: IConnectionPoint;
 opResult:HRESULT;
begin
 try
   ConnectionPointContainer:=(FServer as IConnectionPointContainer);
 except
   ConnectionPointContainer:=nil;
 end;
 if ConnectionPointContainer <> nil then
 begin
   opResult:=ConnectionPointContainer.FindConnectionPoint(IID_IOPCShutdown,
     ConnectionPoint);
   if Succeeded(opResult) and (ConnectionPoint<>nil) then
     ConnectionPoint.Advise(Self as IUnknown, FSrvConnection);
 end;
end;

Пример привел из собственноручно написанного компонента, работающего весьма успешно.


AbrosimovA   (2005-07-07 18:24:00) [6]

Я примерно делаю так:

var ServerIf: IOPCServer;
   Container: IConnectionPointContainer;
   

function Connect(ServerName: string): Boolean;
begin
if Trim(ServerName) <> '' then
begin
 ServerProgID:=StringToOleStr(ServerName);
 HR:=CLSIDFromProgID(ServerProgID,ServerCLSID);
 try
  ServerIf:=CreateComObject(ServerCLSID) as IOPCServer;
 except
  ServerIf := nil;
  LErrorInfo.Caption:='Класс не зарегистрирован';
  Exit;
 end;
 ServerIf.QueryInterface(IID_IConnectionPointContainer,Container);
 Result:=true;
end;
end;  


..., но Container = nil.

Попробую с InterfaceConnect.


Набережных С   (2005-07-07 16:52:00) [7]

>Не понимаю как получить ссылку на интерфейс  IConnectionPointContainer

Просто запросить его у сервера. С помощью QueryInterface. Или обертки InterfaceConnect из ComObj.


Наверх

Титульная страница Поиск, карта сайта Написать письмо