亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? groupunit.pas

?? delphi2007 opcserver
?? PAS
?? 第 1 頁 / 共 3 頁
字號:
unit GroupUnit;

interface

uses Windows,ActiveX,ComObj,FirstServ_TLB,SysUtils,Dialogs,Classes,ServIMPL,OPCDA,axctrls,
     Globals,OpcError,OPCTypes, StdVcl;

type
  TOPCGroup = class(TTypedComObject,IOPCGroup,IOPCItemMgt,IOPCGroupStateMgt,
                    IOPCSyncIO,IConnectionPointContainer,IOPCAsyncIO2)
  private
   FIConnectionPoints:TConnectionPoints;
  protected
   property iFIConnectionPoints:TConnectionPoints read FIConnectionPoints
                          write FIConnectionPoints implements IConnectionPointContainer;
//IOPCItemMgt begin
   function AddItems(dwCount:DWORD; pItemArray:POPCITEMDEFARRAY;
                     out ppAddResults:POPCITEMRESULTARRAY;
                     out ppErrors:PResultList):HResult; stdcall;
   function ValidateItems(dwCount:DWORD; pItemArray:POPCITEMDEFARRAY; bBlobUpdate:BOOL; out ppValidationResults:        POPCITEMRESULTARRAY;
                          out ppErrors:PResultList):HResult; stdcall;
   function RemoveItems(dwCount:DWORD; phServer:POPCHANDLEARRAY; out ppErrors:PResultList):HResult; stdcall;
   function SetActiveState(dwCount:DWORD; phServer:POPCHANDLEARRAY; bActive:BOOL; out ppErrors:PResultList):HResult; stdcall;
   function SetClientHandles(dwCount:DWORD; phServer:POPCHANDLEARRAY;
                                            phClient:POPCHANDLEARRAY;
                             out ppErrors:PResultList):HResult; stdcall;
   function SetDatatypes(dwCount:DWORD; phServer:POPCHANDLEARRAY;
                         pRequestedDatatypes:PVarTypeList;
                         out ppErrors:PResultList):HResult; stdcall;
   function CreateEnumerator(const riid: TIID; out ppUnk: IUnknown): HResult; stdcall;
//IOPCItemMgt end

//IOPCGroupStateMgt begin
   function GetState(out pUpdateRate:DWORD; out pActive:BOOL; out ppName:POleStr;
                     out pTimeBias:Longint; out pPercentDeadband:Single; out pLCID:TLCID;
                     out phClientGroup:OPCHANDLE; out phServerGroup:OPCHANDLE):HResult;overload;stdcall;
   function SetState(pRequestedUpdateRate:PDWORD; out pRevisedUpdateRate:DWORD; pActive:PBOOL;
                     pTimeBias:PLongint; pPercentDeadband:PSingle; pLCID:PLCID;
                     phClientGroup:POPCHANDLE):HResult; stdcall;
   function SetName(szName:POleStr):HResult;stdcall;
   function CloneGroup(szName:POleStr; const riid: TIID; out ppUnk:IUnknown):HResult;stdcall;
//IOPCGroupStateMgt end

//IOPCSyncIO begin
   function Read(dwSource:OPCDATASOURCE; dwCount:DWORD; phServer:POPCHANDLEARRAY;
                 out ppItemValues:POPCITEMSTATEARRAY; out ppErrors:PResultList):HResult;overload;stdcall;
   function Write(dwCount:DWORD; phServer:POPCHANDLEARRAY; pItemValues:POleVariantArray;
                  out ppErrors:PResultList):HResult;overload;stdcall;
//IOPCSyncIO end

//IOPCAsyncIO2 begin
   function Read(dwCount:DWORD; phServer:POPCHANDLEARRAY; dwTransactionID:DWORD;
                 out pdwCancelID:DWORD; out ppErrors:PResultList):HResult;overload;stdcall;
   function Write(dwCount:DWORD; phServer:POPCHANDLEARRAY; pItemValues:POleVariantArray;
                  dwTransactionID:DWORD; out pdwCancelID:DWORD; out ppErrors:PResultList):HResult;overload;stdcall;
   function Refresh2(dwSource:OPCDATASOURCE; dwTransactionID:DWORD;
                     out pdwCancelID:DWORD):HResult;stdcall;
   function Cancel2(dwCancelID:DWORD):HResult;stdcall;
   function SetEnable(bEnable:BOOL):HResult;stdcall;
   function GetEnable(out pbEnable:BOOL):HResult;stdcall;
//IOPCAsyncIO2 end
  public
   servObj:TDA2;                         //the owner
   tagName:string;                       //the name of this group
   clientHandle:longword;                //the client generates we pass to client
   serverHandle:longword;                //we generate the client will passes to us
   requestedUpdateRate:longword;         //update rate in mills
   lang:longword;                        //lanugage id
   nextUpdate:longword;

   ownList,clItems,asyncList:TList;
   groupActive,groupPublic,onDataChangeEnabled:longbool;
   timeBias:longint;
   percentDeadband:single;
   FOnCallBackConnect:TConnectEvent;
   ClientIUnknown:IUnknown;
   lastMSecUpdate:Comp;
   upStream:TMemoryStream;
   groupRemovedRequest:boolean;

   procedure Initialize; override;
   constructor Create(serv:TDA2;oList:TList);
   destructor Destroy;override;
   function ValidateRequestedUpDateRate(dwRequestedUpdateRate:DWORD):DWORD;
   procedure ValidateTimeBias(pTimeBias:PLongint);
   procedure SetUp(szName:string;bActive:BOOL; dwRequestedUpdateRate:DWORD;
                  hClientGroup:OPCHANDLE; pTimeBias:longint; pPercentDeadband:single;
                  dwLCID:DWORD;phServerGroup:longword);
   procedure CallBackOnConnect(const Sink: IUnknown; Connecting: Boolean);
   function GetItemIndexFromServerHandle(servHand:longword;var index:integer):boolean;
   function GetItemIndexFromClientHandle(clHand:longword;var index:integer):boolean;
   function GenerateAsyncCancelID:longword;
   procedure GroupActiveFromInactive;
   procedure TimeSlice(cTime:TDateTime);
   procedure CloneYourSelf(dGrp:TOPCGroup);
   procedure DoAChangeOccured(aStream:TMemoryStream; cTime:TDateTime);
   procedure AsyncTimeSlice(cTime:TDateTime);
  end;

implementation

uses ComServ,ItemsUnit,AsyncUnit,ItemAttributesOPC,EnumItemAtt,Main,Variants;

//IOPCItemMgt begin
function TOPCGroup.AddItems(dwCount:DWORD; pItemArray:POPCITEMDEFARRAY;
                     out ppAddResults:POPCITEMRESULTARRAY;
                     out ppErrors:PResultList):HResult;stdcall;
var
 i:integer;
 wItem:TOPCItem;
 propID:longword;
 memErr:boolean;
 inItemDef:POPCITEMDEF;
begin
 result:=S_OK;
 if (dwCount < 1) then
  begin
   result:=E_INVALIDARG;
   Exit;
  end;

 ppAddResults:=POPCITEMRESULTARRAY(CoTaskMemAlloc(dwCount*sizeof(OPCITEMRESULT)));
 memErr:=boolean(ppAddResults = nil);

 if not memErr then
  begin
   ppErrors:=PResultList(CoTaskMemAlloc(dwCount*sizeof(HRESULT)));
   memErr:=boolean(ppErrors = nil);
  end;

 if memErr then
  begin
   if (ppAddResults <> nil) then
    CoTaskMemFree(ppAddResults);
   if (ppErrors <> nil) then
    CoTaskMemFree(ppErrors);
   result:=E_OUTOFMEMORY;
   Exit;
  end;

 FillChar(ppAddResults[0], dwCount * sizeOf(OPCITEMRESULT),#0);

 for i:= 0 to dwCount - 1 do
  begin
   ppErrors[i]:=S_OK;
   inItemDef:=@pItemArray[i];

   if length(inItemDef.szItemID) = 0 then
    begin
     result:=S_FALSE;
     ppErrors[i]:=OPC_E_INVALIDITEMID;
     Continue;
    end;

   propID:=ReturnPropIDFromTagname(inItemDef.szItemID);

   if (propID = 0) then
    begin
     result:=S_FALSE;
     ppErrors[i]:=OPC_E_UNKNOWNITEMID;
     Continue;
    end;

   if not IsVariantTypeOK(inItemDef.vtRequestedDataType) then
    begin
     result:=S_FALSE;
     ppErrors[i]:=OPC_E_BADTYPE;
     Continue;
    end;

   wItem:=TOPCItem.Create;
   wItem.servObj:=servObj;
   clItems.Add(wItem);
   wItem.serverItemNum:=servObj.GetNewItemNumber;

   wItem.SetActiveState(inItemDef.bActive);
   wItem.SetClientHandle(inItemDef.hClient);
   wItem.itemIndex:=propID - posItems[low(posItems)].PropID;

   wItem.isWriteAble:=CanPropIDBeWritten(propID);

   wItem.canonicalDataType:=ReturnDataTypeFromPropID(propID);
   wItem.SetOldValue;

   wItem.SetReqDataType(inItemDef.vtRequestedDataType);
   wItem.strID:=inItemDef.szItemID;
   wItem.pBlob:=inItemDef.pBlob;

   ppAddResults[i].hServer:=wItem.serverItemNum;
   ppAddResults[i].vtCanonicalDataType:=wItem.canonicalDataType;

   if wItem.isWriteAble then
    ppAddResults[i].dwAccessRights:=OPC_READABLE or OPC_WRITEABLE
   else
    ppAddResults[i].dwAccessRights:=OPC_READABLE;

   ppAddResults[i].dwBlobSize:=0;
   ppAddResults[i].pBlob:=wItem.pBlob;
  end;
end;

function TOPCGroup.ValidateItems(dwCount:DWORD; pItemArray:POPCITEMDEFARRAY;bBlobUpdate:BOOL;
                   out ppValidationResults:POPCITEMRESULTARRAY;out ppErrors:PResultList):HResult; stdcall;
var
 i:integer;
 memErr:boolean;
 propID:longword;
 inItemDef:POPCITEMDEF;
begin
 if (dwCount < 1) then
  begin
   result:=E_INVALIDARG;
   Exit;
  end;

 ppValidationResults:=POPCITEMRESULTARRAY(CoTaskMemAlloc(dwCount * sizeof(OPCITEMRESULT)));
 memErr:=boolean(ppValidationResults = nil);

 if not memErr then
  begin
   ppErrors:=PResultList(CoTaskMemAlloc(dwCount*sizeof(HRESULT)));
   memErr:=boolean(ppErrors = nil);
  end;

 if memErr then
  begin
   if (ppValidationResults <> nil) then
    CoTaskMemFree(ppValidationResults);
   if (ppErrors <> nil) then
    CoTaskMemFree(ppErrors);
   result:=E_OUTOFMEMORY;
   Exit;
  end;

 result:=S_OK;
 FillChar(ppValidationResults[0], dwCount * sizeOf(OPCITEMRESULT),#0);

 for i:= 0 to dwCount - 1 do
  begin
   inItemDef:=@pItemArray[i];

   if (length(inItemDef.szItemID) = 0) then
    begin
     result:=S_FALSE;
     ppErrors[i]:=OPC_E_INVALIDITEMID;
     Continue;
    end;

   if not IsVariantTypeOK(inItemDef.vtRequestedDataType) then
    begin
     result:=S_FALSE;
     ppErrors[i]:=OPC_E_BADTYPE;
     Continue;
    end;

   propID:=ReturnPropIDFromTagname(inItemDef.szItemID);  //also cover 0 length
   if (propID = 0) then
    begin
     result:=S_FALSE;
     ppErrors[i]:=OPC_E_INVALIDITEMID;
     Continue;
    end;

   ppValidationResults[i].vtCanonicalDataType:=ReturnDataTypeFromPropID(propID);
   if CanPropIDBeWritten(propID) then
    ppValidationResults[i].dwAccessRights:=OPC_READABLE or OPC_WRITEABLE
   else
    ppValidationResults[i].dwAccessRights:=OPC_READABLE;
   ppValidationResults[i].dwBlobSize:=0;
   ppErrors[i]:=S_OK;
  end;
end;

function TOPCGroup.RemoveItems(dwCount:DWORD; phServer:POPCHANDLEARRAY; out ppErrors:PResultList):HResult; stdcall;
var
 i,x:integer;
 wItem:TOPCItem;
begin
 if dwCount < 1 then
  begin
   result:=E_INVALIDARG;
   Exit;
  end;

 ppErrors:=PResultList(CoTaskMemAlloc(dwCount*sizeof(HRESULT)));
 if ppErrors = nil then
  begin
   result:=E_OUTOFMEMORY;
   Exit;
  end;

 result:=S_OK;
 for i:= 0 to dwCount -1 do
  if GetItemIndexFromServerHandle(phServer[i],x) then
   begin
    wItem:=clItems[x];
    clItems.Delete(x);
    TOPCItem(wItem).Free;
    ppErrors[i]:=S_OK;
   end
  else
   begin
    result:=S_FALSE;
    ppErrors[i]:=OPC_E_INVALIDHANDLE;
   end;
end;


function TOPCGroup.SetActiveState(dwCount:DWORD; phServer:POPCHANDLEARRAY;
                   bActive:BOOL; out ppErrors:PResultList):HResult; stdcall;
var
 i,x:integer;
begin
 if (dwCount < 1) then
  begin
   result:=E_INVALIDARG;
   Exit;
  end;

 ppErrors:=PResultList(CoTaskMemAlloc(dwCount * sizeof(HRESULT)));
 if (ppErrors = nil) then
  begin
   result:=E_OUTOFMEMORY;
   Exit;
  end;

 result:=S_OK;
 for i:= 0 to dwCount - 1 do
  if GetItemIndexFromServerHandle(phServer[i],x) then
   begin
    TOPCItem(clItems[x]).SetActiveState(bActive);
    ppErrors[i]:=S_OK;
   end
  else
   begin
    result:=S_FALSE;
    ppErrors[i]:=OPC_E_INVALIDHANDLE;
   end;
end;

function TOPCGroup.SetClientHandles(dwCount:DWORD; phServer:POPCHANDLEARRAY;
                                    phClient:POPCHANDLEARRAY;
                                    out ppErrors:PResultList):HResult; stdcall;
var
 i,x:integer;
begin
 if dwCount < 1 then
  begin
   result:=E_INVALIDARG;
   Exit;
  end;

 ppErrors:=PResultList(CoTaskMemAlloc(dwCount*sizeof(HRESULT)));
 if ppErrors = nil then
  begin
   result:=E_OUTOFMEMORY;
   Exit;
  end;

 result:=S_OK;
 for i:= 0 to dwCount -1 do
  if GetItemIndexFromServerHandle(phServer[i],x) then
   begin
    TOPCItem(clItems[x]).SetClientHandle(phClient[i]);
    ppErrors[i]:=S_OK;
   end
  else
   begin
    result:=S_FALSE;
    ppErrors[i]:=OPC_E_INVALIDHANDLE;
   end;
end;

function TOPCGroup.SetDatatypes(dwCount:DWORD; phServer:POPCHANDLEARRAY;
                                pRequestedDatatypes:PVarTypeList;
                                out ppErrors:PResultList):HResult; stdcall;
var
 i,x:integer;
begin
 if (dwCount < 1) then
  begin
   result:=E_INVALIDARG;
   Exit;
  end;

 ppErrors:=PResultList(CoTaskMemAlloc(dwCount*sizeof(HRESULT)));
 if (ppErrors = nil) then
  begin
   result:=E_OUTOFMEMORY;
   Exit;
  end;

 result:=S_OK;
 for i:= 0 to dwCount -1 do
  if GetItemIndexFromServerHandle(phServer[i],x) then
   begin
    if not IsVariantTypeOK(pRequestedDatatypes[i]) then
     begin
      ppErrors[i]:=OPC_E_BADTYPE;
      result:=S_FALSE;
     end
    else
     begin
      TOPCItem(clItems[x]).SetReqDataType(pRequestedDatatypes[i]);
      ppErrors[i]:=S_OK;
     end;
   end
  else
   begin
    result:=S_FALSE;
    ppErrors[i]:=OPC_E_INVALIDHANDLE;
   end;
end;

function TOPCGroup.CreateEnumerator(const riid: TIID; out ppUnk: IUnknown): HResult; stdcall;
var
 i:integer;
 aList:TList;
 aAttr:TOPCItemAttributes;
begin
 if not (IsEqualIID(riid,IID_IEnumOPCItemAttributes) or IsEqualIID(riid,IID_IUnknown)) then

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品亚洲专一区二区三区 | 日韩欧美电影一区| 欧美videossexotv100| 国产精品第五页| 捆绑调教一区二区三区| 色综合色狠狠综合色| 久久丝袜美腿综合| 日韩精品一区第一页| 91久久精品一区二区二区| 国产精品视频一二三区| 免播放器亚洲一区| 777奇米四色成人影色区| 亚洲欧美日韩电影| 91色乱码一区二区三区| 国产色一区二区| 国产在线视视频有精品| 69p69国产精品| 亚洲国产成人porn| 欧美视频一区在线| 一区二区三区免费看视频| www.欧美精品一二区| 国产亚洲成年网址在线观看| 久久99精品久久久久久动态图 | 奇米影视7777精品一区二区| 欧美色偷偷大香| 亚洲主播在线播放| 色综合久久九月婷婷色综合| 亚洲欧美日韩国产一区二区三区 | 日韩视频免费观看高清完整版 | 欧美精品高清视频| 亚洲18色成人| 6080午夜不卡| 蜜桃在线一区二区三区| 91精品国产综合久久精品图片| 一区二区欧美视频| 欧美日韩一级二级| 首页国产欧美日韩丝袜| 日韩一级免费观看| 国产一区二区三区香蕉| 久久老女人爱爱| 成人黄色免费短视频| 亚洲人成7777| 欧美日韩亚洲综合在线 | 一个色在线综合| 欧美亚洲一区二区三区四区| 亚洲一区国产视频| 91 com成人网| 久草在线在线精品观看| 久久视频一区二区| 99精品久久久久久| 日韩精品色哟哟| 久久久久成人黄色影片| 97久久精品人人爽人人爽蜜臀| 亚洲青青青在线视频| 欧美卡1卡2卡| 久久精品av麻豆的观看方式| 国产亚洲1区2区3区| 91网站黄www| 日韩成人av影视| 国产精品人人做人人爽人人添| 色一情一乱一乱一91av| 日本成人在线看| 中文字幕一区二区三区四区不卡 | 日本一区免费视频| 欧美色图在线观看| 国产伦精品一区二区三区免费| 亚洲欧洲日韩综合一区二区| 欧美日韩免费电影| 福利一区二区在线| 日韩精品亚洲专区| 中文字幕在线一区二区三区| 91精品欧美综合在线观看最新| 国产一区二区三区四区五区入口| 日韩美女精品在线| 欧美成va人片在线观看| 91蝌蚪porny九色| 国产中文字幕精品| 亚洲电影欧美电影有声小说| 久久久精品综合| 91麻豆精品国产91久久久久久久久| 国产福利91精品一区| 亚洲国产aⅴ成人精品无吗| 国产欧美精品一区二区色综合 | 国产女人aaa级久久久级| 欧美视频精品在线| 99免费精品在线观看| 麻豆精品新av中文字幕| 亚洲二区在线视频| 亚洲欧美在线高清| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩一区二区三区不卡| 成人久久视频在线观看| 久久国产精品无码网站| 午夜免费欧美电影| 樱花草国产18久久久久| 国产精品免费av| 久久蜜臀精品av| 精品嫩草影院久久| 91精品国产综合久久精品| 在线观看av一区二区| caoporm超碰国产精品| 国产福利一区二区三区| 国产一区二区三区电影在线观看| 香蕉av福利精品导航| 亚洲一区二区三区在线看| 亚洲精品国产一区二区精华液| 中文天堂在线一区| 国产精品女同一区二区三区| 久久精品网站免费观看| 久久久精品蜜桃| 国产日韩精品一区| 亚洲国产精品精华液ab| 亚洲国产成人私人影院tom| 久久久久久免费毛片精品| 精品国产乱子伦一区| 精品国产乱码久久久久久1区2区| 欧美一区二区三区四区视频| 欧美一级夜夜爽| 亚洲精品一区在线观看| 国产偷v国产偷v亚洲高清| 中文字幕不卡三区| 亚洲欧美日韩中文字幕一区二区三区| 亚洲三级在线看| 亚洲电影第三页| 欧美a一区二区| 国产一区二区剧情av在线| 国产成人在线视频网址| 成人免费观看av| 欧洲日韩一区二区三区| 欧美剧情电影在线观看完整版免费励志电影| 在线这里只有精品| 91精品国产入口| 久久久精品日韩欧美| 中文字幕一区二区三区蜜月| 亚洲一二三区视频在线观看| 日韩av一区二| 成人午夜视频在线观看| 欧美日韩一区二区欧美激情| 日韩欧美国产综合一区 | 日韩你懂的在线播放| 久久久国产午夜精品| 亚洲欧美日韩人成在线播放| 日韩国产一二三区| 国产精品一区不卡| 欧美在线视频全部完| 欧美zozozo| 亚洲女厕所小便bbb| 蜜桃久久精品一区二区| 不卡av在线免费观看| 欧美精品v国产精品v日韩精品| 精品久久久久久久人人人人传媒| 中文字幕亚洲一区二区av在线| 亚洲一区二区三区四区五区黄| 韩国精品主播一区二区在线观看 | 日韩二区在线观看| 99久久99久久精品国产片果冻| 欧美日韩大陆在线| 国产精品你懂的在线| 亚洲h在线观看| av成人免费在线| 精品国产一区a| 亚洲成人久久影院| 成人美女视频在线看| 欧美二区三区的天堂| 中文字幕一区三区| 国产精品一区二区无线| 欧美日韩成人激情| 亚洲欧美日韩成人高清在线一区| 黄网站免费久久| 欧美精品国产精品| 亚洲一区在线看| 99久久精品费精品国产一区二区| 日韩亚洲欧美一区二区三区| 亚洲愉拍自拍另类高清精品| 国产91清纯白嫩初高中在线观看 | 国产成人精品三级| 日韩欧美你懂的| 日韩在线一区二区| 欧美日韩在线播放三区四区| 中文字幕在线不卡| av在线不卡免费看| 久久精品欧美一区二区三区不卡| 男人操女人的视频在线观看欧美 | 精品国产第一区二区三区观看体验| 亚洲老妇xxxxxx| 99久久99久久久精品齐齐| 国产精品网站一区| 国产aⅴ综合色| 日本一区二区视频在线观看| 国产美女在线精品| 26uuu久久综合| 狠狠色狠狠色综合系列| 日韩美女视频在线| 狠狠色丁香久久婷婷综合_中 | 激情五月婷婷综合| 久久综合丝袜日本网| 国产精品一区二区91| 欧美国产日韩一二三区| 大白屁股一区二区视频| 国产精品视频一二三|