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

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

?? servimpl.pas

?? delphi2007 opcserver
?? PAS
字號:
unit ServIMPL;

interface

uses Windows,ComObj,ActiveX,Axctrls,FirstServ_TLB,OPCDA,SysUtils,Dialogs,Classes,
     OPCCOMN,StdVCL,enumstring,ItemPropIMPL,Globals,OpcError,OPCErrorStrings,
     EnumUnknown,OPCTypes,IOPCCommonUnit;

type
  TDA2 = class(TAutoObject,IDA2,IOPCServer,IOPCCommon,IOPCBrowseServerAddressSpace,
               IConnectionPointContainer,IOPCItemProperties)
  private
   FIOPCCommon:TIOPCCommon;                     //IOPCCommon
   FIOPCItemProperties:TOPCItemProp;
   FIConnectionPoints:TConnectionPoints;
  protected
   property iFIOPCCommon:TIOPCCommon read FIOPCCommon write FIOPCCommon
                                                      implements IOPCCommon;
   property iFIConnectionPoints:TConnectionPoints read FIConnectionPoints
                          write FIConnectionPoints implements IConnectionPointContainer;
//IOPCServer begin
    function AddGroup(szName:POleStr;bActive:BOOL; dwRequestedUpdateRate:DWORD;
                      hClientGroup:OPCHANDLE; pTimeBias:PLongint; pPercentDeadband:PSingle;
                      dwLCID:DWORD; out phServerGroup: OPCHANDLE;
                                    out pRevisedUpdateRate:DWORD;
                                    const riid: TIID;
                                    out ppUnk:IUnknown):HResult;stdcall;
    function GetErrorString(dwError:HResult; dwLocale:TLCID; out ppString:POleStr):HResult;overload; stdcall;
    function GetGroupByName(szName:POleStr; const riid: TIID; out ppUnk:IUnknown):HResult; stdcall;
    function GetStatus(out ppServerStatus:POPCSERVERSTATUS): HResult; stdcall;
    function RemoveGroup(hServerGroup: OPCHANDLE; bForce: BOOL): HResult; stdcall;
    function CreateGroupEnumerator(dwScope:OPCENUMSCOPE; const riid:TIID; out ppUnk:IUnknown):HResult; stdcall;
//IOPCServer end

//IOPCBrowseServerAddressSpace begin
   function QueryOrganization(out pNameSpaceType:OPCNAMESPACETYPE):HResult;stdcall;
   function ChangeBrowsePosition(dwBrowseDirection:OPCBROWSEDIRECTION;
                                 szString:POleStr):HResult;stdcall;
   function BrowseOPCItemIDs(dwBrowseFilterType:OPCBROWSETYPE; szFilterCriteria:POleStr;
                             vtDataTypeFilter:TVarType; dwAccessRightsFilter:DWORD;
                             out ppIEnumString:IEnumString):HResult;stdcall;
   function GetItemID(szItemDataID:POleStr; out szItemID:POleStr):HResult;stdcall;
   function BrowseAccessPaths(szItemID:POleStr; out ppIEnumString:IEnumString):HResult;stdcall;
//IOPCBrowseServerAddressSpace end

  public
   grps,pubGrps,removedGroups:TList;
   localID:longword;
   clientName,errString:string;
   srvStarted,lastClientUpdate:TDateTime;
   FOnSDConnect: TConnectEvent;
   ClientIUnknown:IUnknown;
   property iFIOPCItemProperties:TOPCItemProp read FIOPCItemProperties
                                              write FIOPCItemProperties
                                              implements IOPCItemProperties;

   procedure CreateGroups;
   procedure Initialize; override;
   procedure ShutdownOnConnect(const Sink: IUnknown; Connecting: Boolean);

   destructor Destroy;override;
   function GetNewGroupNumber:longword;
   function GetNewItemNumber:longword;
   function FindIndexViaGrpNumber(wGrp:TList;gNum:longword):integer;
   function FindIndexFromGroupNumberInRemovedGroup(groupNum:longword):integer;
   procedure GroupRemovingSelf(wGrp:TList;gNum:integer);
   function GetGroupCount(gList:TList):integer;
   function CreateGrpNameList(gList:TList):TStringList;
   function IsGroupNamePresent(gList:TList;theName:string):integer;
   function IsNameUsedInAnyGroup(theName:string):boolean;
   function IsThisGroupPublic(aList:TList):boolean;
   procedure TimeSlice(cTime:TDateTime);
   function CloneAGroup(szName:string;aGrp:TTypedComObject; out res:HResult):IUnknown;
  end;

var
 theServers:array [0..10] of TDA2;

implementation

uses ComServ,Main,GroupUnit,OPCRemovedGroupUnit,Masks;

{$INCLUDE IOPCServerIMPL}
{$INCLUDE IOPCBrowseServerAddressSpaceIMPL}

function GetNextFreeServerSpot:integer;
var
 i:integer;
begin
 result:=-1;
 for i:= low(theServers) to high(theServers) do
  if not Assigned(theServers[i]) then
   begin
    result:=i;
    Exit;
   end;
end;

function FindServerInArray(which:TDA2):integer;
var
 i:integer;
begin
 result:=-1;
 for i:= low(theServers) to high(theServers) do
  if Assigned(theServers[i]) then
   if (theServers[i] = which) then
    begin
     result:=i;
     Exit;
    end;
end;

function ReturnServerCount:integer;
var
 i:integer;
begin
 result:=0;
 for i:= low(theServers) to high(theServers) do
  if Assigned(theServers[i]) then
   Inc(result);
end;

procedure KillServers;
var
 i:integer;
begin
 for i:= high(theServers) downTo low(theServers) do
  begin
   CoDisconnectObject(TDA2(theServers[i]) as IUnknown,0);
   TDA2(theServers[i]).Free;
  end;
 FreeAndNil(theServers);
end;

procedure TDA2.CreateGroups;
begin
 if (grps <> nil) then
  Exit;
 grps:=TList.Create;
 grps.Capacity:=255;
 pubGrps:=TList.Create;
 pubGrps.Capacity:=grps.Capacity;

 removedGroups:=TList.Create;
end;

procedure TDA2.Initialize;
var
 i:integer;
begin
 i:=GetNextFreeServerSpot;
 if (i = -1) then
  Exit;
 inherited Initialize;
 srvStarted:=Now;
 lastClientUpdate:=0;
 localID:=LOCALE_SYSTEM_DEFAULT;

 FIOPCCommon:=TIOPCCommon.Create;
 FIConnectionPoints:=TConnectionPoints.Create(self);
 FIOPCItemProperties:=TOPCItemProp.Create;

 FOnSDConnect:=ShutdownOnConnect;
 FIConnectionPoints.CreateConnectionPoint(IID_IOPCShutdown,ckSingle,FOnSDConnect);

 CreateGroups;

 //hook into Main program here    may have multiple servers
 theServers[i]:=self;
 Form1.UpdateGroupCount;
end;

procedure TDA2.ShutdownOnConnect(const Sink: IUnknown; Connecting: Boolean);
begin
 if connecting then
  ClientIUnknown:=Sink
 else
  ClientIUnknown:=nil
end;

destructor TDA2.Destroy;
var
 i:integer;
begin
 if Assigned(grps) then
  begin
   for i:= 0 to grps.count - 1 do
    TOPCGroup(grps.Items[i]).Free;
   grps.Free;
  end;

 if Assigned(pubGrps) then
  begin
   for i:= 0 to pubGrps.count - 1 do
    TOPCGroup(pubGrps.Items[i]).Free;
   pubGrps.Free;
  end;

 if Assigned(removedGroups) then
  begin
   for i:= removedGroups.count - 1 downTo 0 do
    if Assigned(removedGroups.Items[i]) then
     TOPCGroupRemoved(removedGroups.Items[i]).Free;
   FreeAndNil(removedGroups);
  end;

 i:=FindServerInArray(self);
 if (i <> -1) then
  theServers[i]:=nil;                //the client has let us be free ;)

 if Assigned(FIOPCCommon) then
  FreeAndNil(FIOPCCommon);
 if Assigned(FIConnectionPoints) then
  FIConnectionPoints.Free;
 if Assigned(FIOPCItemProperties) then
  FIOPCItemProperties.Free;



 Form1.UpdateGroupCount;
 Inherited;
end;

function TDA2.GetNewGroupNumber:longword;
const
 grpIndex:longword = 1;             //Assignable Typed Constants gota lovem
begin
 Inc(grpIndex);         //get us a new reference number
 result:=grpIndex;
end;

function TDA2.GetNewItemNumber:longword;
const
 itemIndex:longword = 1;
begin
 Inc(itemIndex);
 result:=itemIndex;
end;

function TDA2.FindIndexViaGrpNumber(wGrp:TList;gNum:longword):integer;
var
 i:integer;
begin
 result:=-1;
 for i:= 0 to wGrp.count - 1 do
  if (TOPCGroup(wGrp[i]).serverHandle = gNum) then
   begin
    result:=i;
    Break;
   end;
end;

function TDA2.FindIndexFromGroupNumberInRemovedGroup(groupNum:longword):integer;
var
 i:integer;
begin
 result:=-1;
 for i:= 0 to removedGroups.count -1 do
  if (TOPCGroupRemoved(removedGroups[i]).oldServerHandle = groupNum) then
   begin
    result:=i;
    Break;
   end;
end;

procedure TDA2.GroupRemovingSelf(wGrp:TList; gNum:integer);
var
 i:integer;
 oldGroup:TOPCGroupRemoved;
begin
 i:=FindIndexViaGrpNumber(wGrp,gNum);
 if (i <> -1) then
  begin
   with TOPCGroup(wGrp[i]) do
    oldGroup:=TOPCGroupRemoved.Create(tagName,serverHandle,wGrp);
   removedGroups.Add(oldGroup);
   wGrp.Delete(i);
   Form1.UpdateGroupCount;
  end;
end;

function TDA2.GetGroupCount(gList:TList):integer;
begin
 result:=0;
 if (gList = nil) then
  Exit;
 result:=gList.count;
end;

function TDA2.CreateGrpNameList(gList:TList):TStringList;
var
 i:integer;
begin
 result:=nil;
 if (gList = nil) then
  Exit;
 result:=TStringList.Create;
 for i:= 0 to gList.count - 1 do
  result.Add(TOPCGroup(gList.Items[i]).tagName);

 if (result.count = 0) then
  begin
   result.Free;
   result:=nil;
  end;
end;

function TDA2.IsGroupNamePresent(gList:TList; theName:string):integer;
var
 i:integer;
begin
 result:=-1;
 for i:= 0 to gList.count - 1 do
  if (theName = TOPCGroup(gList.Items[i]).tagName) then
   begin
    result:=i;
    Break;
   end;
end;

function TDA2.IsNameUsedInAnyGroup(theName:string):boolean;
var
 i:integer;
begin
 result:=false;
 i:=IsGroupNamePresent(grps,theName);
 if (i <> -1) then
  begin
   result:=true;
   Exit;
  end;

 i:=IsGroupNamePresent(pubGrps,theName);
 if (i <> -1) then
  result:=true;
end;

function TDA2.IsThisGroupPublic(aList:TList):boolean;
begin
 result:=boolean((pubGrps <> nil)    and
                 (pubGrps.count = 0) and
                 (aList <> nil)      and
                 (pubGrps = aList));
end;

procedure TDA2.TimeSlice(cTime:TDateTime);
var
 i:integer;
begin
 lastClientUpdate:=cTime;

 if Assigned(grps) and (grps.count > 0) then
  begin
   i:=0;
   while i <= (grps.count - 1) do
    begin
     if Assigned(grps[i]) then
      TOPCGroup(grps[i]).TimeSlice(cTime);
     Inc(i);
    end;
  end;

 if Assigned(pubGrps) and (pubGrps.count > 0) then
  begin
   i:=0;
   while i <= (pubGrps.count - 1) do
    begin
     if Assigned(pubGrps[i]) then
      TOPCGroup(pubGrps[i]).TimeSlice(cTime);
     Inc(i);
    end;
  end;
end;

function TDA2.CloneAGroup(szName:string;aGrp:TTypedComObject; out res:HResult):IUnknown;
var
 sGrp,dGrp:TOPCGroup;
begin
 sGrp:=TOPCGroup(aGrp);
 dGrp:=TOPCGroup.Create(self,grps);
 if (dGrp = nil) then
  begin
   result:=nil;
   res:=E_OUTOFMEMORY;
   Exit;
  end;

 grps.Add(dGrp);
 dGrp.tagName:=szName;
 sGrp.CloneYourSelf(dGrp);
 result:=dGrp;
 res:=S_OK;
end;

initialization
  TAutoObjectFactory.Create(ComServer, TDA2, Class_DA2,
                            ciMultiInstance, tmApartment);

 //if an OPC client(s) is connected and the user has selected to quit after
 //the warning in the FormCloseQuery then do not let the system ask again in the
 //AutomationTerminateProc procedure in the VCL.
 ComServer.UIInteractive:=false;
finalization
 //if an OPC client is connected and this is a forced kill then if CoUnintialize
 //is not called here the OLE dll will generate an error when it is called after
 //we have killed the servers.
 CoUninitialize;
 KillServers;
end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费高清不卡av| 91色九色蝌蚪| 一本久久a久久免费精品不卡| 欧美色综合影院| 国产色91在线| 奇米一区二区三区| 一本到一区二区三区| 久久精品人人爽人人爽| 午夜不卡在线视频| 91麻豆国产自产在线观看| 2022国产精品视频| 日本aⅴ亚洲精品中文乱码| 色综合天天综合狠狠| 久久久国产精品不卡| 日韩av一区二区三区| 色欧美88888久久久久久影院| 久久香蕉国产线看观看99| 青青草91视频| 7777精品伊人久久久大香线蕉超级流畅 | 欧美aaaaaa午夜精品| 色综合亚洲欧洲| 国产精品福利av| 粗大黑人巨茎大战欧美成人| 欧美成人r级一区二区三区| 首页综合国产亚洲丝袜| 欧美日韩小视频| 婷婷国产在线综合| 欧美日韩久久一区| 亚洲一区二区欧美激情| 色吧成人激情小说| 亚洲精品视频在线| 91久久人澡人人添人人爽欧美| 国产精品久久久久一区二区三区共 | 91精品国产高清一区二区三区蜜臀| 亚洲人成网站精品片在线观看| 高清在线不卡av| 国产拍欧美日韩视频二区| 国产最新精品精品你懂的| 亚洲精品在线观看视频| 麻豆一区二区三| 欧美v日韩v国产v| 精品制服美女久久| 日本一区二区三区dvd视频在线| 国精产品一区一区三区mba视频 | 中文一区一区三区高中清不卡| 黄色精品一二区| 国产女主播一区| 色哟哟亚洲精品| 亚洲午夜一二三区视频| 欧美精品亚洲一区二区在线播放| 日本不卡123| 久久久久久久av麻豆果冻| 国产精品456| 一色屋精品亚洲香蕉网站| 欧美色图免费看| 精品一区二区免费视频| 中文字幕欧美区| 91福利区一区二区三区| 爽爽淫人综合网网站| 26uuuu精品一区二区| 成人网在线播放| 午夜欧美2019年伦理| 精品国产精品网麻豆系列| av中文字幕一区| 婷婷夜色潮精品综合在线| 久久精品亚洲麻豆av一区二区| 91色在线porny| 久久精品国产一区二区三区免费看| 久久综合色之久久综合| 91麻豆免费看| 韩国av一区二区三区在线观看| 国产精品国模大尺度视频| 欧美日韩一区二区三区在线| 久久精品99久久久| 亚洲少妇最新在线视频| 日韩欧美在线综合网| 91亚洲精品久久久蜜桃| 久久精品国产一区二区三区免费看| 国产精品乱码一区二三区小蝌蚪| 欧美日韩国产一区二区三区地区| 韩国毛片一区二区三区| 午夜免费欧美电影| 国产精品国产自产拍高清av王其| 欧美一级黄色大片| 精品视频在线视频| 成人免费毛片片v| 精品一区免费av| 午夜精品久久久久久久99樱桃| 中文字幕第一区综合| 91精品国产91久久久久久一区二区| 9色porny自拍视频一区二区| 久久电影网电视剧免费观看| 夜夜嗨av一区二区三区| 国产精品五月天| www国产亚洲精品久久麻豆| 在线播放一区二区三区| 色94色欧美sute亚洲13| 99久久99久久综合| 国产精品一区二区视频| 精品一区二区成人精品| 日韩av网站免费在线| 五月激情综合色| 亚洲综合精品自拍| 自拍偷拍亚洲激情| 久久九九99视频| 51精品国自产在线| 欧美日免费三级在线| 色悠悠久久综合| av亚洲精华国产精华| 国内精品嫩模私拍在线| 奇米综合一区二区三区精品视频| 亚洲欧美日韩国产一区二区三区 | 国产精品视频免费| 在线不卡a资源高清| 91一区二区三区在线观看| 国内精品伊人久久久久av影院 | 国产91丝袜在线观看| 麻豆成人91精品二区三区| 亚洲成人自拍网| 亚洲午夜视频在线观看| 亚洲蜜桃精久久久久久久| 欧美激情一区二区| 久久久久久一级片| 久久久精品欧美丰满| 精品国产乱码久久久久久免费| 91精品国产色综合久久| 制服丝袜一区二区三区| 欧美另类z0zxhd电影| 欧美一级片在线观看| 日韩欧美中文字幕制服| 精品国产伦一区二区三区观看体验 | 国产在线一区观看| 免费在线看成人av| 免费在线一区观看| 久久99久国产精品黄毛片色诱| 美女视频黄频大全不卡视频在线播放| 中文字幕一区二区不卡| 韩国成人在线视频| 黄色资源网久久资源365| 国产精品一级片| 成人永久aaa| 99精品久久99久久久久| 欧美日韩视频不卡| 欧美一级日韩不卡播放免费| 欧美电影免费观看高清完整版在| 日韩免费一区二区| 久久精品人人爽人人爽| 亚洲乱码国产乱码精品精98午夜 | jizzjizzjizz欧美| 色综合久久久久综合99| 欧美性淫爽ww久久久久无| 欧美日韩色一区| 欧美不卡一二三| 久久综合色播五月| 一区二区在线观看av| 午夜精品国产更新| 国产制服丝袜一区| 99久久久无码国产精品| 久久99在线观看| 在线精品亚洲一区二区不卡| 717成人午夜免费福利电影| 久久综合色之久久综合| 国产精品成人免费精品自在线观看| 国产精品国产三级国产aⅴ原创| 性做久久久久久久久| 国产一区二区福利| 91一区二区三区在线观看| 4438成人网| 国产精品美女久久久久av爽李琼| 日韩精品免费专区| 国产91清纯白嫩初高中在线观看| 92国产精品观看| 日韩一级高清毛片| 国产精品大尺度| 日本欧美加勒比视频| av一区二区久久| 久久综合中文字幕| 亚洲成国产人片在线观看| 国产精品一区在线观看你懂的| 欧美精品在线观看播放| 欧美激情一区在线观看| 日本一不卡视频| 欧洲亚洲精品在线| 国产午夜一区二区三区| 免费人成在线不卡| 欧美亚洲国产一区二区三区va | 国产日韩欧美精品在线| 丝袜脚交一区二区| 欧美性受xxxx| 国产精品国产三级国产aⅴ无密码| 美洲天堂一区二卡三卡四卡视频| 一本大道综合伊人精品热热 | 奇米四色…亚洲| 欧美性色aⅴ视频一区日韩精品| 精品美女在线播放| 日韩福利电影在线| 欧美午夜不卡在线观看免费| 国产精品久久毛片a| 国产大片一区二区| 亚洲精品一区二区三区精华液|