uint hClientGroup = 1;
try
{
//Если ранее была активирована подписка, то отменить ее
if (m_dwCookie != 0)
m_pDataCallback.Unadvise(m_dwCookie);
if (m_hGroup != 0)
{
pServer.RemoveGroup(m_hGroup, 1);
m_hASyncGroup = 0;
}
pServer.AddGroup("MyGroup", bActive, updateRate, hClientGroup, ref TimeBias, ref DeadBand,
2, out m_hASyncGroup, out updateRate, ref riid, out iFaceObj);
IOPCItemMgt pItemMgt = (IOPCItemMgt)iFaceObj;
uint dwCount = 1;
IConnectionPointContainer pCPC;
pCPC = (IConnectionPointContainer)iFaceObj;
riid = typeof(IOPCDataCallback).GUID;
pCPC.FindConnectionPoint(ref riid, out m_pDataCallback);
tagOPCITEMDEF pItems = new tagOPCITEMDEF();
//Создаем объект обработчика событий сервера или если он уже был создан изменяем
идентификатор элемента данных на текущий
if (null == m_pSink)
m_pSink = new DataCallback(this, szItemID);
else
m_pSink.SetItemID(szItemID);
//Подписываемся на события сервера
m_pDataCallback.Advise(m_pSink, out m_dwCookie);
pItems.szItemID = szItemID;
pItems.szAccessPath = null;
pItems.bActive = 1;
pItems.hClient = 1;
pItems.vtRequestedDataType = (ushort)VarEnum.VT_EMPTY;
pItems.dwBlobSize = 0;
pItems.pBlob = IntPtr.Zero;
IntPtr iptrErrors = IntPtr.Zero;
IntPtr iptrResults = IntPtr.Zero;
pItemMgt.AddItems(dwCount,pItems, out iptrResults, out iptrErrors);
int[] hRes = new int[1];
Marshal.Copy(iptrErrors, hRes, 0, 1);