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

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

?? asyncunit.pas

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

interface

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

type
  TAsyncIO2 = class
  public
   grp:TOPCGroup;
   source:integer;
   isCancelled:boolean;
   ppServer:PDWORDARRAY;
   ppValues:POleVariantArray;
   kind,clientTransID,cancelID,itemCount:longword;
   aStream:TMemoryStream;
   constructor Create(aGrp:TOPCGroup;ioKind,cID,count:longword;dwSource:integer);
   destructor Destroy;override;
   procedure DoCancelCallBack;
   procedure HandleRead(cTime:TDateTime);
   procedure HandleWrite(cTime:TDateTime);
   procedure HandleRefresh(cTime:TDateTime);
   procedure HandleChange(aStream:TMemoryStream; cTime:TDateTime);
   procedure HandleThisRequest(cTime:TDateTime);
  end;

implementation

uses Variants;

var
 Obj:Pointer;

constructor TAsyncIO2.Create(aGrp:TOPCGroup;ioKind,cID,count:longword;dwSource:integer);
begin
 grp:=aGrp;
 kind:=ioKind;
 clientTransID:=cID;
 itemCount:=count;
 ppServer:=nil;
 isCancelled:=false;
 source:=dwSource;
 cancelID:=grp.GenerateAsyncCancelID;
end;

destructor TAsyncIO2.Destroy;
begin
 grp:=nil;
 if (ppServer <> nil) then
  CoTaskMemFree(ppServer);
 if (ppValues <> nil) then
  CoTaskMemFree(ppValues);
end;

procedure TAsyncIO2.DoCancelCallBack;
begin
 if not Succeeded(TOPCGroup(grp).ClientIUnknown.QueryInterface(IID_IOPCDataCallback,Obj)) then
  Exit;
 IOPCDataCallback(Obj).OnCancelComplete(clientTransID,TOPCGroup(grp).clientHandle);
end;

procedure TAsyncIO2.HandleRead(cTime:TDateTime);
var
 i:longword;
 aItem:TOPCItem;
 aFileTime:TFileTime;
 ppErrors:PResultList;
 ppQualityArray:PWORDARRAY;
 ppClientItems:PDWORDARRAY;
 pVariants:POleVariantArray;
 ppTimeArray:PFileTimeArray;
 masterResult,masterQuality:HRESULT;
begin

 ppClientItems:=nil;
 pVariants:=nil;
 ppErrors:=nil;
 ppQualityArray:=nil;
 ppTimeArray:=nil;

 try
  ppClientItems:=PDWORDARRAY(CoTaskMemAlloc(itemCount * sizeof(longword)));
  if (ppClientItems = nil) then
   Exit;

  pVariants:=POleVariantArray(CoTaskMemAlloc(itemCount * sizeof(OleVariant)));
  if (pVariants = nil) then
   Exit;

  FillChar(pVariants[0],itemCount * sizeOf(OleVariant),#0);   //no variant conversion errors

  ppErrors:=PResultList(CoTaskMemAlloc(itemCount*sizeof(HRESULT)));
  if (ppErrors = nil) then
   Exit;

  ppQualityArray:=PWORDARRAY(CoTaskMemAlloc(itemCount*sizeof(word)));
  if (ppQualityArray = nil) then
   Exit;

  ppTimeArray:=PFileTimeArray(CoTaskMemAlloc(itemCount*sizeof(TFileTime)));
  if (ppTimeArray = nil) then
   Exit;

  DataTimeToOPCTime(cTime,aFileTime);
  masterResult:=S_OK;
  masterQuality:=S_OK;
  for i:= 0 to itemCount - 1 do
   begin
    ppTimeArray[i]:=aFileTime;
    pVariants[i]:=VT_EMPTY;
    ppClientItems[i]:=0;

    aItem:=TOPCItem(TOPCGroup(grp).clItems[ppServer[i]]);

//check access rights here

    aItem.CallBackRead(ppClientItems[i],pVariants[i],ppQualityArray[i],
                       ppErrors[i],true);

    if not aItem.bActive then
     ppQualityArray[i]:=OPC_QUALITY_OUT_OF_SERVICE;
   end;

  if isCancelled then
   Exit;

  IOPCDataCallback(Obj).OnReadComplete(clientTransID,
                                       grp.clientHandle,
                                       masterQuality,
                                       masterResult,
                                       itemCount,
                                       @ppClientItems^,
                                       @pVariants^,
                                       @ppQualityArray^,
                                       @ppTimeArray^,
                                       @ppErrors^);

 finally
  if (ppClientItems <> nil) then
   CoTaskMemFree(ppClientItems);
  if (pVariants <> nil) then
   CoTaskMemFree(pVariants);
  if (ppErrors <> nil) then
   CoTaskMemFree(ppErrors);
  if (ppQualityArray <> nil) then
   CoTaskMemFree(ppQualityArray);
  if (ppTimeArray <> nil) then
   CoTaskMemFree(ppTimeArray);
 end;
end;

procedure TAsyncIO2.HandleWrite(cTime:TDateTime);
var
 aItem:TOPCItem;
 vType:integer;
 ppErrors:PResultList;
 i,masterResult:longword;
 ppClientItems:PDWORDARRAY;

 procedure HandleException(x:integer);
 begin
  ppErrors[x]:=OPC_E_BADTYPE;
  masterResult:=S_FALSE;
 end;

begin
 ppClientItems:=nil;
 ppErrors:=nil;

 try
  ppClientItems:=PDWORDARRAY(CoTaskMemAlloc(itemCount * sizeof(longword)));
  if (ppClientItems = nil) then
   Exit;

  ppErrors:=PResultList(CoTaskMemAlloc(itemCount * sizeof(HRESULT)));
  if (ppErrors = nil) then
  Exit;

  masterResult:=S_OK;
  for i:= 0 to itemCount - 1 do
   begin
    if (ppServer[i] > longword((grp.clItems.count - 1))) then
     begin
      ppErrors[i]:=OPC_E_INVALIDITEMID;
      masterResult:=S_FALSE;
      Continue;
     end;

    aItem:=TOPCItem(grp.clItems[ppServer[i]]);
    ppClientItems[i]:=aItem.GetClientHandle;
    if not aItem.isWriteAble then
     begin
      ppErrors[i]:=OPC_E_BADRIGHTS;
      masterResult:=S_FALSE;
      Continue;
     end;

    vType:=VarType(ppValues[i]);
    if (vType = varEmpty) or not IsVariantTypeOK(vType) then
     begin
      ppErrors[i]:=OPC_E_BADTYPE;
      masterResult:=S_FALSE;
     end
    else
     begin
      try
       aItem.WriteItemValue(ppValues[i],ppErrors[i]);
      except
       HandleException(i);
      end;
     end;
   end;

  if isCancelled then
   Exit;

  IOPCDataCallback(Obj).OnWriteComplete(clientTransID,
                                        grp.clientHandle,
                                        masterResult,
                                        itemCount,
                                        @ppClientItems^,
                                        @ppErrors^);
 finally
  if ppClientItems <> nil then
   CoTaskMemFree(ppClientItems);
  if ppErrors <> nil then
   CoTaskMemFree(ppErrors);
 end;
end;

procedure TAsyncIO2.HandleRefresh(cTime:TDateTime);
var
 x:integer;
 aFileTime:TFileTime;
 ppErrors:PResultList;
 i,masterResult,masterQuality:longword;
 ppQualityArray:PWORDARRAY;
 ppClientItems:PDWORDARRAY;
 pVariants:POleVariantArray;
 ppTimeArray:PFileTimeArray;
begin
 ppClientItems:=nil;
 pVariants:=nil;
 ppErrors:=nil;
 ppQualityArray:=nil;
 ppTimeArray:=nil;

 try
  for i:= 0 to grp.clItems.count - 1 do
   if TOPCItem(grp.clItems[i]).GetActiveState then
    Inc(itemCount);

  if (itemCount = 0) then
   Exit;

  ppClientItems:=PDWORDARRAY(CoTaskMemAlloc(itemCount * sizeof(longword)));
  if (ppClientItems = nil) then
   Exit;

  pVariants:=POleVariantArray(CoTaskMemAlloc(itemCount * sizeof(OleVariant)));
  if (pVariants = nil) then
   Exit;

  FillChar(pVariants[0],itemCount * sizeOf(OleVariant),#0);   //no variant conversion errors

  ppErrors:=PResultList(CoTaskMemAlloc(itemCount * sizeof(HRESULT)));
  if (ppErrors = nil) then
   Exit;

  ppQualityArray:=PWORDARRAY(CoTaskMemAlloc(itemCount * sizeof(word)));
  if (ppQualityArray = nil) then
   Exit;

  ppTimeArray:=PFileTimeArray(CoTaskMemAlloc(itemCount * sizeof(TFileTime)));
  if (ppTimeArray = nil) then
   Exit;

  DataTimeToOPCTime(cTime,aFileTime);
  masterResult:=S_OK;
  masterQuality:=S_OK;

  x:=0;
  for i:= 0 to grp.clItems.count - 1 do
   if TOPCItem(grp.clItems[i]).GetActiveState then
    begin
     ppTimeArray[x]:=aFileTime;
     ppClientItems[x]:=TOPCItem(grp.clItems[i]).GetClientHandle;
     pVariants[x]:=TOPCItem(grp.clItems[i]).ReturnCurrentValue(source,
                            ppQualityArray[x],ppErrors[x]);

     if (ppQualityArray[x] <> OPC_QUALITY_GOOD) then
      masterQuality:=S_FALSE;
     Inc(x);
    end
   else
    begin
     ppQualityArray[x]:=OPC_QUALITY_OUT_OF_SERVICE;
     ppErrors[x]:=S_FALSE;
     masterQuality:=S_FALSE;
    end;

  if isCancelled then
   Exit;

  IOPCDataCallback(Obj).OnDataChange(clientTransID,
                                     grp.clientHandle,
                                     masterQuality,
                                     masterResult,
                                     itemCount,
                                     @ppClientItems^,
                                     @pVariants^,
                                     @ppQualityArray^,
                                     @ppTimeArray^,
                                     @ppErrors^);

 finally
  if (ppClientItems <> nil) then
   CoTaskMemFree(ppClientItems);
  if (pVariants <> nil) then
   CoTaskMemFree(pVariants);
  if (ppErrors <> nil) then
   CoTaskMemFree(ppErrors);
  if (ppQualityArray <> nil) then
   CoTaskMemFree(ppQualityArray);
  if (ppTimeArray <> nil) then
   CoTaskMemFree(ppTimeArray);
 end;
end;

procedure TAsyncIO2.HandleChange(aStream:TMemoryStream; cTime:TDateTime);
var
 x,k:integer;
 aFileTime:TFileTime;
 ppErrors:PResultList;
 i,masterResult:longword;
 ppQualityArray:PWORDARRAY;
 ppClientItems:PDWORDARRAY;
 pVariants:POleVariantArray;
 ppTimeArray:PFileTimeARRAY;
begin
 ppClientItems:=nil;
 pVariants:=nil;
 ppErrors:=nil;
 ppQualityArray:=nil;
 ppTimeArray:=nil;

 try
  ppClientItems:=PDWORDARRAY(CoTaskMemAlloc(itemCount*sizeof(longword)));
  if (ppClientItems = nil) then
   Exit;

  pVariants:=POleVariantArray(CoTaskMemAlloc(itemCount * sizeof(OleVariant)));
  if (pVariants = nil) then
   Exit;

  FillChar(pVariants[0],itemCount * sizeOf(OleVariant),#0);   //no variant conversion errors

  ppErrors:=PResultList(CoTaskMemAlloc(itemCount*sizeof(HRESULT)));
  if (ppErrors = nil) then
   Exit;

  ppQualityArray:=PWORDARRAY(CoTaskMemAlloc(itemCount*sizeof(word)));
  if (ppQualityArray = nil) then
   Exit;

  ppTimeArray:=PFileTimeARRAY(CoTaskMemAlloc(itemCount*sizeof(TFileTime)));
  if (ppTimeArray = nil) then
   Exit;

  DataTimeToOPCTime(cTime,aFileTime);
  masterResult:=S_OK;
  x:=0;

  aStream.Seek(0,soFromBeginning);
  for i:= 0 to itemCount - 1 do
   begin
    aStream.Read(k,sizeOf(k));
    if (TOPCGroup(grp).clItems.count >= k) then
     if Assigned(TOPCItem(TOPCGroup(grp).clItems[k])) then
      begin
       ppTimeArray[x]:=aFileTime;
       ppClientItems[x]:=TOPCItem(TOPCGroup(grp).clItems[k]).GetClientHandle;
       with TOPCItem(TOPCGroup(grp).clItems[k]) do
        CallBackRead(ppClientItems[x],pVariants[x], ppQualityArray[x],ppErrors[x],
                     false);
       Inc(x);
      end;
    end;

   if isCancelled then
    Exit;

   IOPCDataCallback(Obj).OnDataChange(clientTransID,
                                      TOPCGroup(grp).clientHandle,
                                      OPC_QUALITY_GOOD,
                                      masterResult,
                                      itemCount,
                                      @ppClientItems^,
                                      @pVariants^,
                                      @ppQualityArray^,
                                      @ppTimeArray^,
                                      @ppErrors^);

 finally
  if (ppClientItems <> nil) then
   CoTaskMemFree(ppClientItems);
  if (pVariants <> nil) then
   CoTaskMemFree(pVariants);
  if (ppErrors <> nil) then
   CoTaskMemFree(ppErrors);
  if (ppQualityArray <> nil) then
   CoTaskMemFree(ppQualityArray);
  if (ppTimeArray <> nil) then
   CoTaskMemFree(ppTimeArray);
 end;
end;

procedure TAsyncIO2.HandleThisRequest(cTime:TDateTime);
begin
 if isCancelled then
  Exit;

 if not Assigned(TOPCGroup(grp).ClientIUnknown) then
  Exit;

 if not Succeeded(TOPCGroup(grp).ClientIUnknown.QueryInterface(IID_IOPCDataCallback,Obj)) then
  Exit;

 case kind of
  io2Read:         HandleRead(cTime);
  io2Write:        HandleWrite(cTime);
  io2Refresh:      HandleRefresh(cTime);
  io2Change:       HandleChange(aStream, cTime)
 end;
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品一区二区三区一线天视频| 色视频欧美一区二区三区| 亚洲私人黄色宅男| 国产精品情趣视频| 国产精品国产馆在线真实露脸 | 夜夜嗨av一区二区三区网页| 国产精品国产自产拍在线| 国产精品的网站| 亚洲欧洲另类国产综合| 国产精品久久久久aaaa| 亚洲成人高清在线| 日韩电影免费在线| 麻豆成人91精品二区三区| 久久草av在线| 夫妻av一区二区| 色中色一区二区| 欧美日韩午夜影院| 欧美xxxxxxxxx| 欧美国产97人人爽人人喊| 国产区在线观看成人精品| 亚洲日本va午夜在线影院| 亚洲国产精品麻豆| 九九在线精品视频| 不卡欧美aaaaa| 欧美久久一二三四区| 日韩一区二区不卡| 国产欧美一区二区三区在线老狼| 中文字幕综合网| 偷拍自拍另类欧美| 国产久卡久卡久卡久卡视频精品| 99精品视频一区二区三区| 色综合久久88色综合天天6| 欧美日韩国产经典色站一区二区三区| 日韩视频免费观看高清在线视频| 中文字幕乱码亚洲精品一区| 亚洲午夜影视影院在线观看| 极品销魂美女一区二区三区| 97精品超碰一区二区三区| 欧美一区二区三区四区五区| 中文字幕成人在线观看| 婷婷中文字幕综合| 成人午夜电影久久影院| 制服丝袜亚洲网站| 日韩伦理av电影| 国产一区视频导航| 欧美日韩一区成人| 中文字幕不卡的av| 看片的网站亚洲| 色国产精品一区在线观看| 久久久久久久久99精品| 亚洲一区二区三区四区五区黄| 国产一区二区三区最好精华液| 日本精品一级二级| 国产精品人成在线观看免费 | 久久97超碰国产精品超碰| 91网址在线看| 国产亚洲精品aa| 免费精品99久久国产综合精品| 色欧美乱欧美15图片| 国产精品午夜电影| 国产一区二区0| 欧美成人午夜电影| 亚洲午夜在线电影| 在线观看亚洲一区| 亚洲精品写真福利| eeuss鲁片一区二区三区| 久久久久久久久99精品| 久久国产精品一区二区| 欧美一区二区成人6969| 天天影视色香欲综合网老头| 欧洲色大大久久| 一卡二卡欧美日韩| 色狠狠色狠狠综合| 一区二区视频免费在线观看| 99国产精品国产精品毛片| 中文乱码免费一区二区| 国产99久久久国产精品潘金| 久久精品视频一区二区| 国内精品视频一区二区三区八戒 | 日本强好片久久久久久aaa| 欧美在线观看视频在线| 亚洲欧洲av在线| 99国产一区二区三精品乱码| 国产精品你懂的在线欣赏| 成人av午夜电影| 中文字幕在线不卡国产视频| 波多野结衣精品在线| 亚洲精品日日夜夜| 欧美亚洲日本一区| 婷婷综合在线观看| 亚洲精品一区二区三区影院| 国产精品538一区二区在线| 国产三级精品在线| 色综合夜色一区| 午夜欧美大尺度福利影院在线看| 欧美丰满嫩嫩电影| 激情深爱一区二区| 最新国产の精品合集bt伙计| 欧美亚洲国产一区二区三区va | 国产精品你懂的| 91香蕉视频污在线| 婷婷一区二区三区| 国产婷婷精品av在线| 91蜜桃在线观看| 天堂一区二区在线| 国产三级欧美三级| 欧美在线观看一区二区| 精品一区二区在线免费观看| 国产片一区二区三区| 欧美又粗又大又爽| 麻豆国产精品一区二区三区| 亚洲图片你懂的| 日韩精品五月天| 精品系列免费在线观看| 久久久久久久久久久久久夜| 色综合久久综合中文综合网| 日韩影院在线观看| 中文字幕在线观看不卡| 日韩视频一区二区在线观看| 99久久精品国产一区| 日产精品久久久久久久性色| 欧美激情一区二区| 日韩午夜在线影院| 91网上在线视频| 国产九九视频一区二区三区| 亚洲高清视频中文字幕| 日本一区二区在线不卡| 日韩午夜av电影| 久久久久久久久久久久电影| 欧美综合色免费| 成人av网站免费| 久久精品国产久精国产爱| 亚洲制服丝袜在线| 中文字幕乱码一区二区免费| 日韩视频免费观看高清在线视频| 91捆绑美女网站| 国产99久久久精品| 国内精品伊人久久久久影院对白| 亚洲一区二区三区美女| 亚洲日本护士毛茸茸| 国产精品美女久久久久av爽李琼| 精品乱人伦一区二区三区| 正在播放亚洲一区| 欧美人牲a欧美精品| 欧美日韩色一区| 91国偷自产一区二区开放时间 | 久久九九国产精品| 精品国产乱码久久久久久免费| 欧美日韩高清一区二区三区| 一道本成人在线| 91视频在线观看| 91看片淫黄大片一级| 色综合天天综合网国产成人综合天 | 国产精品电影院| 国产人久久人人人人爽| 欧美激情在线一区二区| 国产午夜亚洲精品不卡| 欧美精品一区二区三区久久久| 日韩手机在线导航| 日韩一区和二区| 久久综合色综合88| 精品国产乱码久久久久久闺蜜 | 国产精品视频yy9299一区| 久久久精品蜜桃| 国产精品久久久久三级| 中文字幕在线一区二区三区| 亚洲欧洲中文日韩久久av乱码| 亚洲综合久久久久| 亚洲高清三级视频| 老汉av免费一区二区三区| 国内精品伊人久久久久av一坑| 国产成人亚洲综合a∨婷婷 | 欧美午夜影院一区| 欧美三级乱人伦电影| 91精品国产91久久综合桃花 | 在线日韩av片| 678五月天丁香亚洲综合网| 日韩欧美国产一区二区三区| 国产亚洲美州欧州综合国| 中文字幕在线观看不卡视频| 亚洲成va人在线观看| 国产在线乱码一区二区三区| 暴力调教一区二区三区| 欧美欧美欧美欧美首页| 久久久一区二区| 亚洲一区自拍偷拍| 久久国产欧美日韩精品| 91原创在线视频| 日韩午夜激情免费电影| 国产精品理论片在线观看| 亚洲电影你懂得| 高清成人免费视频| 欧美人伦禁忌dvd放荡欲情| 国产欧美中文在线| 日韩成人伦理电影在线观看| 粉嫩久久99精品久久久久久夜| 欧美日韩国产大片| 国产精品久久久久久亚洲毛片| 蜜桃精品视频在线| 色欲综合视频天天天|