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

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

?? opcquick.dpr

?? opc client 客戶端delphi源碼
?? DPR
字號:
program OPCquick;

{$IFDEF VER150}
{$WARN UNSAFE_CAST OFF}
{$WARN UNSAFE_TYPE OFF}
{$ENDIF}
{$IFDEF VER170}
{$WARN UNSAFE_CAST OFF}
{$WARN UNSAFE_CODE OFF}
{$ENDIF}

uses
{$IFDEF VER140}
  Variants,
{$ENDIF}
{$IFDEF VER150}
  Variants,
{$ENDIF}
{$IFDEF VER170}
  Variants,
{$ENDIF}
{$IFDEF VER180}
  Variants,
{$ENDIF}
{$IFDEF VER200}
  Variants,
{$ENDIF}
  Windows, Forms, ComObj, ActiveX, SysUtils, OPCtypes, OPCDA, OPCutils;

{$R *.RES}

const
  OneSecond = 1 / (24 * 60 * 60);
  // these are for use with the MatrikonOPC sample server
  ServerProgID = 'Matrikon.OPC.Simulation';
  Item0Name = 'Triangle Waves.Real8';
  Item1Name = 'Bucket Brigade.Real4';
  RPC_C_AUTHN_LEVEL_NONE = 1;
  RPC_C_IMP_LEVEL_IMPERSONATE = 3;
  EOAC_NONE = 0;

type
  // class to receive IDataObject data change advises
  TOPCAdviseSink = class(TInterfacedObject, IAdviseSink)
  public
    procedure OnDataChange(const formatetc: TFormatEtc;
                            const stgmed: TStgMedium); stdcall;
    procedure OnViewChange(dwAspect: Longint; lindex: Longint); stdcall;
    procedure OnRename(const mk: IMoniker); stdcall;
    procedure OnSave; stdcall;
    procedure OnClose; stdcall;
  end;

  // class to receive IConnectionPointContainer data change callbacks
  TOPCDataCallback = class(TInterfacedObject, IOPCDataCallback)
  public
    function OnDataChange(dwTransid: DWORD; hGroup: OPCHANDLE;
      hrMasterquality: HResult; hrMastererror: HResult; dwCount: DWORD;
      phClientItems: POPCHANDLEARRAY; pvValues: POleVariantArray;
      pwQualities: PWordArray; pftTimeStamps: PFileTimeArray;
      pErrors: PResultList): HResult; stdcall;
    function OnReadComplete(dwTransid: DWORD; hGroup: OPCHANDLE;
      hrMasterquality: HResult; hrMastererror: HResult; dwCount: DWORD;
      phClientItems: POPCHANDLEARRAY; pvValues: POleVariantArray;
      pwQualities: PWordArray; pftTimeStamps: PFileTimeArray;
      pErrors: PResultList): HResult; stdcall;
    function OnWriteComplete(dwTransid: DWORD; hGroup: OPCHANDLE;
      hrMastererr: HResult; dwCount: DWORD; pClienthandles: POPCHANDLEARRAY;
      pErrors: PResultList): HResult; stdcall;
    function OnCancelComplete(dwTransid: DWORD; hGroup: OPCHANDLE):
      HResult; stdcall;
  end;

var
  ServerIf: IOPCServer;
  GroupIf: IOPCItemMgt;
  GroupHandle: OPCHANDLE;
  Item0Handle: OPCHANDLE;
  Item1Handle: OPCHANDLE;
  ItemType: TVarType;
  ItemValue: string;
  ItemQuality: Word;
  HR: HResult;
  AdviseSink: IAdviseSink;
  AsyncConnection: Longint;
  OPCDataCallback: IOPCDataCallback;
  StartTime: TDateTime;

// TOPCAdviseSink methods

// OPC standard says this is the only method we need to fill in
procedure TOPCAdviseSink.OnDataChange(const formatetc: TFormatEtc;
                                      const stgmed: TStgMedium);
var
  PG: POPCGROUPHEADER;
  PI1: POPCITEMHEADER1ARRAY;
  PI2: POPCITEMHEADER2ARRAY;
  PV: POleVariant;
  I: Integer;
  PStr: PWideChar;
  NewValue: string;
  WithTime: Boolean;
  ClientHandle: OPCHANDLE;
  Quality: Word;
begin
  // the rest of this method assumes that the item header array uses
  // OPCITEMHEADER1 or OPCITEMHEADER2 records,
  // so check this first to be defensive
  if (formatetc.cfFormat <> OPCSTMFORMATDATA) and
      (formatetc.cfFormat <> OPCSTMFORMATDATATIME) then Exit;
  // does the data stream provide timestamps with each value?
  WithTime := formatetc.cfFormat = OPCSTMFORMATDATATIME;

  PG := GlobalLock(stgmed.hGlobal);
  if PG <> nil then
  begin
    // we will only use one of these two values, according to whether
    // WithTime is set:
    PI1 := Pointer(PAnsiChar(PG) + SizeOf(OPCGROUPHEADER));
    PI2 := Pointer(PI1);
    if Succeeded(PG.hrStatus) then
    begin
      for I := 0 to PG.dwItemCount - 1 do
      begin
        if WithTime then
        begin
          PV := POleVariant(PAnsiChar(PG) + PI1[I].dwValueOffset);
          ClientHandle := PI1[I].hClient;
          Quality := (PI1[I].wQuality and OPC_QUALITY_MASK);
        end
        else begin
          PV := POleVariant(PAnsiChar(PG) + PI2[I].dwValueOffset);
          ClientHandle := PI2[I].hClient;
          Quality := (PI2[I].wQuality and OPC_QUALITY_MASK);
        end;
        if Quality = OPC_QUALITY_GOOD then
        begin
          // this test assumes we're not dealing with array data
          if TVarData(PV^).VType <> VT_BSTR then
          begin
            NewValue := VarToStr(PV^);
          end
          else begin
            // for BSTR data, the BSTR image follows immediately in the data
            // stream after the variant union;  the BSTR begins with a DWORD
            // character count, which we skip over as the BSTR is also
            // NULL-terminated
            PStr := PWideChar(PAnsiChar(PV) + SizeOf(OleVariant) + 4);
            NewValue := WideString(PStr);
          end;
          if WithTime then
          begin
            Writeln('New value for item ', ClientHandle, ' advised:  ',
                    NewValue, ' (with timestamp)');
          end
          else begin
            Writeln('New value for item ', ClientHandle, ' advised:  ',
                    NewValue);
          end;
        end
        else begin
          Writeln('Advise received for item ', ClientHandle,
                  ' , but quality not good');
        end;
      end;
    end;
    GlobalUnlock(stgmed.hGlobal);
  end;
end;

procedure TOPCAdviseSink.OnViewChange(dwAspect: Longint; lindex: Longint);
begin
end;

procedure TOPCAdviseSink.OnRename(const mk: IMoniker);
begin
end;

procedure TOPCAdviseSink.OnSave;
begin
end;

procedure TOPCAdviseSink.OnClose;
begin
end;

// TOPCDataCallback methods

function TOPCDataCallback.OnDataChange(dwTransid: DWORD; hGroup: OPCHANDLE;
  hrMasterquality: HResult; hrMastererror: HResult; dwCount: DWORD;
  phClientItems: POPCHANDLEARRAY; pvValues: POleVariantArray;
  pwQualities: PWordArray; pftTimeStamps: PFileTimeArray;
  pErrors: PResultList): HResult;
var
  ClientItems: POPCHANDLEARRAY;
  Values: POleVariantArray;
  Qualities: PWORDARRAY;
  I: Integer;
  NewValue: string;
begin
  Result := S_OK;
  ClientItems := POPCHANDLEARRAY(phClientItems);
  Values := POleVariantArray(pvValues);
  Qualities := PWORDARRAY(pwQualities);
  for I := 0 to dwCount - 1 do
  begin
    if Qualities[I] = OPC_QUALITY_GOOD then
    begin
      NewValue := VarToStr(Values[I]);
      Writeln('New callback for item ', ClientItems[I], ' received, value:  ',
              NewValue);
    end
    else begin
      Writeln('Callback received for item ', ClientItems[I],
              ' , but quality not good');
    end;
  end;
end;

function TOPCDataCallback.OnReadComplete(dwTransid: DWORD; hGroup: OPCHANDLE;
  hrMasterquality: HResult; hrMastererror: HResult; dwCount: DWORD;
  phClientItems: POPCHANDLEARRAY; pvValues: POleVariantArray;
  pwQualities: PWordArray; pftTimeStamps: PFileTimeArray;
  pErrors: PResultList): HResult;
begin
  Result := OnDataChange(dwTransid, hGroup, hrMasterquality, hrMastererror,
    dwCount, phClientItems, pvValues, pwQualities, pftTimeStamps, pErrors);
end;

function TOPCDataCallback.OnWriteComplete(dwTransid: DWORD; hGroup: OPCHANDLE;
  hrMastererr: HResult; dwCount: DWORD; pClienthandles: POPCHANDLEARRAY;
  pErrors: PResultList): HResult;
begin
  // we don't use this facility
  Result := S_OK;
end;

function TOPCDataCallback.OnCancelComplete(dwTransid: DWORD;
  hGroup: OPCHANDLE): HResult;
begin
  // we don't use this facility
  Result := S_OK;
end;

// main program code

begin
  // among other things, this call makes sure that COM is initialized
  Application.Initialize;
  Writeln('========================================================');
  Writeln('Simple OPC client program, by Mike Dillamore, 1998-2008.');
  Writeln('Tested for compatibility with Delphi 3-7 and 2005-2009. ');
  Writeln('Requires OPC Simulation server from MatrikonOPC,        ');
  Writeln('but easily modified for use with other servers.         ');
  Writeln('========================================================');
  Writeln;

  // this is for DCOM:
  // without this, callbacks from the server may get blocked, depending on
  // DCOM configuration settings
  HR := CoInitializeSecurity(
    nil,                    // points to security descriptor
    -1,                     // count of entries in asAuthSvc
    nil,                    // array of names to register
    nil,                    // reserved for future use
    RPC_C_AUTHN_LEVEL_NONE, // the default authentication level for proxies
    RPC_C_IMP_LEVEL_IMPERSONATE,// the default impersonation level for proxies
    nil,                    // used only on Windows 2000
    EOAC_NONE,              // additional client or server-side capabilities
    nil                     // reserved for future use
    );
  if Failed(HR) then
  begin
    Writeln('Failed to initialize DCOM security');
  end;

  try
    // we will use the custom OPC interfaces, and OPCProxy.dll will handle
    // marshaling for us automatically (if registered)
    ServerIf := CreateComObject(ProgIDToClassID(ServerProgID)) as IOPCServer;
  except
    ServerIf := nil;
  end;
  if ServerIf <> nil then
  begin
    Writeln('Connected to OPC server');
  end
  else begin
    Writeln('Unable to connect to OPC server');
    Exit;
  end;

  // now add a group
  HR := ServerAddGroup(ServerIf, 'MyGroup', True, 500, 0, GroupIf, GroupHandle);
  if Succeeded(HR) then
  begin
    Writeln('Added group to server');
  end
  else begin
    Writeln('Unable to add group to server');
    Exit;
  end;

  // now add an item to the group
  HR := GroupAddItem(GroupIf, Item0Name, 0, VT_EMPTY, Item0Handle,
    ItemType);
  if Succeeded(HR) then
  begin
    Writeln('Added item 0 to group');
  end
  else begin
    Writeln('Unable to add item 0 to group');
    ServerIf.RemoveGroup(GroupHandle, False);
    Exit;
  end;
  // now add a second item to the group
  HR := GroupAddItem(GroupIf, Item1Name, 1, VT_EMPTY, Item1Handle,
    ItemType);
  if Succeeded(HR) then
  begin
    Writeln('Added item 1 to group');
  end
  else begin
    Writeln('Unable to add item 1 to group');
    ServerIf.RemoveGroup(GroupHandle, False);
    Exit;
  end;

  // set up an IDataObject advise callback for the group
  AdviseSink := TOPCAdviseSink.Create;
  HR := GroupAdviseTime(GroupIf, AdviseSink, AsyncConnection);
  if Failed(HR) then
  begin
    Writeln('Failed to set up IDataObject advise callback');
  end
  else begin
    Writeln('IDataObject advise callback established');
    // continue waiting for callbacks for 10 seconds
    StartTime := Now;
    while (Now - StartTime) < (10 * OneSecond) do
    begin
      Application.ProcessMessages;
    end;
    // end the IDataObject advise callback
    GroupUnadvise(GroupIf, AsyncConnection);
  end;

  // now set up an IConnectionPointContainer data callback for the group
  OPCDataCallback := TOPCDataCallback.Create;
  HR := GroupAdvise2(GroupIf, OPCDataCallback, AsyncConnection);
  if Failed(HR) then
  begin
    Writeln('Failed to set up IConnectionPointContainer advise callback');
  end
  else begin
    Writeln('IConnectionPointContainer data callback established');
    // continue waiting for callbacks for 10 seconds
    StartTime := Now;
    while (Now - StartTime) < (10 * OneSecond) do
    begin
      Application.ProcessMessages;
    end;
    // end the IConnectionPointContainer data callback
    GroupUnadvise2(GroupIf, AsyncConnection);
  end;

  // now try to read the item value synchronously
  HR := ReadOPCGroupItemValue(GroupIf, Item0Handle, ItemValue, ItemQuality);
  if Succeeded(HR) then
  begin
    if (ItemQuality and OPC_QUALITY_MASK) = OPC_QUALITY_GOOD then
    begin
      Writeln('Item 0 value read synchronously as ', ItemValue);
    end
    else begin
      Writeln('Item 0 value was read synchronously, but quality was not good');
    end;
  end
  else begin
    Writeln('Failed to read item 0 value synchronously');
  end;

  // finally write the value just read from item 0 into item 1
  // Note: WriteOPCGroupItemValues may be used to write multiple item values
  HR := WriteOPCGroupItemValue(GroupIf, Item1Handle, ItemValue);
  if Succeeded(HR) then
  begin
    Writeln('Item 1 value written synchronously');
  end
  else begin
    Writeln('Failed to write item 1 value synchronously');
  end;

  // wait for 1 second
  StartTime := Now;
  while (Now - StartTime) < OneSecond do
  begin
    Application.ProcessMessages;
  end;

  // and try to read it back
  HR := ReadOPCGroupItemValue(GroupIf, Item1Handle, ItemValue, ItemQuality);
  if Succeeded(HR) then
  begin
    if (ItemQuality and OPC_QUALITY_MASK) = OPC_QUALITY_GOOD then
    begin
      Writeln('Item 1 value read synchronously as ', ItemValue);
    end
    else begin
      Writeln('Item 1 value was read synchronously, but quality was not good');
    end;
  end
  else begin
    Writeln('Failed to read item 0 value synchronously');
  end;

  // now cleanup
  HR := ServerIf.RemoveGroup(GroupHandle, False);
  if Succeeded(HR) then
  begin
    Writeln('Removed group');
  end
  else begin
    Writeln('Unable to remove group');
  end;

  // Delphi runtime library will release all interfaces automatically when
  // variables go out of scope
end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品69久久久久水密桃| 亚洲九九爱视频| 9191久久久久久久久久久| 在线视频一区二区三| 色婷婷综合中文久久一本| 91亚洲精品久久久蜜桃网站| 日本韩国欧美一区| 在线一区二区三区做爰视频网站| 色老综合老女人久久久| 色婷婷一区二区三区四区| 色爱区综合激月婷婷| 在线电影国产精品| 精品国产一区二区三区av性色| www一区二区| 国产精品看片你懂得| 亚洲男人天堂av网| 青青草原综合久久大伊人精品| 日本三级亚洲精品| 国产乱码字幕精品高清av| 成人aa视频在线观看| 91婷婷韩国欧美一区二区| 69av一区二区三区| 精品播放一区二区| 亚洲美女视频在线| 奇米影视在线99精品| 成人免费毛片片v| 欧美日韩美少妇 | 人人超碰91尤物精品国产| 国产伦精一区二区三区| 99久久er热在这里只有精品15 | 色婷婷精品大视频在线蜜桃视频 | 国产91在线|亚洲| 欧美日韩aaaaaa| 国产亚洲一区二区三区在线观看| 亚洲欧美偷拍另类a∨色屁股| 婷婷综合久久一区二区三区| 高清成人在线观看| 91精品婷婷国产综合久久| 国产欧美在线观看一区| 日韩精品午夜视频| 成人av午夜电影| 精品国产一二三| 亚洲一二三区在线观看| 成人综合日日夜夜| 日韩一二三区不卡| 亚洲在线视频免费观看| 国产成人啪午夜精品网站男同| 欧美日韩亚洲另类| 中文字幕亚洲在| 国产精品一区二区果冻传媒| 欧美精品色综合| 有坂深雪av一区二区精品| 国产成人精品三级麻豆| 日韩欧美你懂的| 日韩专区欧美专区| 色屁屁一区二区| 欧美韩国一区二区| 久久激情五月激情| 666欧美在线视频| 图片区日韩欧美亚洲| 欧美性受xxxx黑人xyx性爽| 中文字幕第一区| 国产精品亚洲专一区二区三区 | 人人精品人人爱| 色婷婷亚洲婷婷| 欧美高清在线一区| 国内精品伊人久久久久av影院 | 麻豆视频一区二区| 欧美男生操女生| 亚洲免费观看视频| 91在线一区二区三区| 亚洲欧美综合另类在线卡通| 成人av在线资源网站| 久久精品视频一区二区| 黑人精品欧美一区二区蜜桃| 日韩精品影音先锋| 亚洲成人三级小说| 91黄色免费版| 亚洲国产精品一区二区久久| 91毛片在线观看| 国产精品福利电影一区二区三区四区| 精品一区二区在线视频| 日韩欧美久久一区| 国产剧情一区二区| 久久久99精品免费观看不卡| 久久99精品国产.久久久久| 2020日本不卡一区二区视频| 国内精品国产成人国产三级粉色| 久久久国产一区二区三区四区小说 | 日本一区二区在线不卡| 成人动漫一区二区在线| 亚洲人快播电影网| 欧美日韩一级片在线观看| 亚洲成人自拍偷拍| 日韩欧美国产wwwww| 国产美女一区二区三区| 国产精品久久久久久久久果冻传媒| av电影在线观看一区| 亚洲一区二区精品久久av| 3751色影院一区二区三区| 免费成人在线视频观看| 国产日产欧美一区| 欧洲av一区二区嗯嗯嗯啊| 日本特黄久久久高潮| 国产无人区一区二区三区| 一本大道av一区二区在线播放| 亚洲福利一区二区三区| 精品乱码亚洲一区二区不卡| 成人一区在线看| 五月婷婷综合在线| 久久综合狠狠综合久久激情| 91农村精品一区二区在线| 日本欧美韩国一区三区| 中文字幕va一区二区三区| 欧美日韩在线不卡| 韩国女主播一区二区三区| 一区二区在线观看视频在线观看| 欧美一区二区三区在线电影| 国产成a人亚洲精| 日本成人超碰在线观看| 国产精品的网站| 久久久久国产精品人| 欧美日韩精品高清| 成人激情小说乱人伦| 另类人妖一区二区av| 日韩一区中文字幕| 精品国精品国产尤物美女| 欧洲精品在线观看| 成人国产在线观看| 精品一区二区免费视频| 亚洲免费三区一区二区| 国产日韩欧美不卡在线| 欧美一区二区三区免费大片| 91免费看`日韩一区二区| 国产专区综合网| 日韩精品欧美成人高清一区二区| 一区二区三区在线免费播放| 国产精品久久久久久久岛一牛影视| 日韩久久精品一区| 欧美精品日韩一本| 欧洲一区二区三区在线| 91丝袜国产在线播放| 丰满少妇久久久久久久| 国内精品自线一区二区三区视频| 日本午夜精品一区二区三区电影| 一区二区三区在线观看欧美| 亚洲国产经典视频| 国产欧美一区二区三区鸳鸯浴| 日韩欧美国产wwwww| 日韩视频在线观看一区二区| 欧美电影在线免费观看| 91麻豆精品国产91久久久使用方法| 欧美日韩在线不卡| 欧美日韩国产一区| 在线观看视频91| 欧美电影一区二区| 欧美三级资源在线| 欧美一区二区精美| 精品国产污网站| 国产三级欧美三级| 一区精品在线播放| 亚洲精品视频免费看| 午夜私人影院久久久久| 日本麻豆一区二区三区视频| 九色综合狠狠综合久久| 国产成人亚洲精品青草天美| 成人av电影在线| 欧美日韩一区二区三区高清 | 久久成人18免费观看| 国产一区不卡在线| 色综合一个色综合| 欧美日韩精品二区第二页| 日韩精品专区在线影院重磅| 国产色产综合色产在线视频 | 欧美a级一区二区| 国产福利一区二区三区在线视频| 99re热这里只有精品视频| 欧美视频一区二区三区| 26uuu亚洲综合色| 亚洲欧美日韩综合aⅴ视频| 天天做天天摸天天爽国产一区| 精品制服美女久久| 91蜜桃在线免费视频| 91精品视频网| 国产精品福利一区| 蜜桃精品视频在线观看| 成人av午夜电影| 欧美一二三区在线观看| 国产精品久99| 奇米影视7777精品一区二区| 91在线国产福利| 精品国产亚洲一区二区三区在线观看 | 极品美女销魂一区二区三区 | 亚洲一区二区三区国产| 国产一区二区三区在线观看免费| 欧美综合视频在线观看| 久久久精品黄色| 免费不卡在线观看| 色婷婷综合视频在线观看| 久久久久久免费|