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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? opcquick.dpr

?? OPC SERVER delphi源代碼
?? DPR
字號(hào):
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}
  Windows, Forms, ComObj, ActiveX, SysUtils, OPCtypes, OPCDA, OPCutils;

{$R *.RES}

const
  OneSecond = 1 / (24 * 60 * 60);
  // these are for use with the Matrikon 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(PChar(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(PChar(PG) + PI1[I].dwValueOffset);
          ClientHandle := PI1[I].hClient;
          Quality := (PI1[I].wQuality and OPC_QUALITY_MASK);
        end
        else begin
          PV := POleVariant(PChar(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(PChar(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-2004.');
  Writeln('Tested for compatibility with Delphi 3-7 and 2005.      ');
  Writeln('Requires Simulation OPC server from Matrikon,           ');
  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
  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.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩制服丝袜av| 亚洲国产美女搞黄色| 91精彩视频在线| 精品一区二区av| 亚洲激情欧美激情| 久久久久久麻豆| 91精品国产色综合久久不卡电影 | 亚洲6080在线| 国产精品沙发午睡系列990531| 88在线观看91蜜桃国自产| 国产成人精品亚洲日本在线桃色| 五月综合激情婷婷六月色窝| 国产精品二三区| 2020国产精品自拍| 欧美高清hd18日本| 一本久久a久久精品亚洲| 国产精品中文字幕日韩精品| 日韩高清电影一区| 亚洲18影院在线观看| 亚洲青青青在线视频| 国产精品久久久久久福利一牛影视 | 夜夜爽夜夜爽精品视频| 中文字幕欧美日本乱码一线二线| 日韩午夜三级在线| 欧美日韩国产综合久久| 日本久久一区二区三区| 99久久99久久综合| 91亚洲精品久久久蜜桃网站 | 精品视频一区 二区 三区| 成人一区二区三区在线观看| 激情综合网天天干| 精品一区二区三区久久久| 免费成人美女在线观看| 蜜桃视频一区二区三区| 日韩中文字幕亚洲一区二区va在线 | 777久久久精品| 欧美区一区二区三区| 欧美日韩的一区二区| 欧美色综合网站| 欧美日韩在线综合| 欧美日韩国产免费一区二区| 在线精品视频免费观看| 欧美日韩国产美女| 7777精品伊人久久久大香线蕉超级流畅| 色噜噜久久综合| 欧美丝袜丝nylons| 56国语精品自产拍在线观看| 日韩丝袜美女视频| 麻豆精品久久久| 麻豆精品久久精品色综合| 激情深爱一区二区| 国产福利一区二区三区视频| 高清成人在线观看| 99久久99久久综合| 欧美午夜精品一区二区蜜桃| 91麻豆精品久久久久蜜臀| 欧美一二三四区在线| 久久婷婷成人综合色| 国产精品另类一区| 亚洲精品中文在线| 午夜精品福利一区二区三区av | 欧美一区二区免费视频| 日韩美一区二区三区| 久久精品无码一区二区三区| 国产精品久久久久久久久免费相片| 中文字幕亚洲一区二区av在线| 亚洲乱码精品一二三四区日韩在线 | 精品国产伦一区二区三区观看体验| 久久综合一区二区| 国产精品国产自产拍高清av王其| 日韩理论片网站| 偷窥国产亚洲免费视频| 国内精品伊人久久久久影院对白| 国产成人欧美日韩在线电影| 91老师国产黑色丝袜在线| 欧美日韩亚洲高清一区二区| 久久美女高清视频| 99久久精品一区| 欧美一区二区三区精品| 国产精品拍天天在线| 亚洲一区二区在线免费观看视频| 欧美aaaaa成人免费观看视频| 丁香婷婷综合网| 69av一区二区三区| 亚洲欧美一区二区在线观看| 日日夜夜精品视频免费| 成人中文字幕合集| 5858s免费视频成人| 日韩一区日韩二区| 精品系列免费在线观看| 色天使色偷偷av一区二区| 精品久久久影院| 亚洲永久免费av| 国产不卡视频一区二区三区| 欧美日本国产视频| 国产精品黄色在线观看 | 91在线云播放| 日韩免费观看高清完整版| 亚洲精品免费一二三区| 国产一区欧美日韩| 欧美写真视频网站| 亚洲国产精品成人综合色在线婷婷| 香蕉乱码成人久久天堂爱免费| 成人小视频在线| 精品国产污网站| 天堂av在线一区| 91老师国产黑色丝袜在线| 麻豆成人91精品二区三区| 在线亚洲免费视频| 国产欧美日韩精品在线| 欧美aⅴ一区二区三区视频| 91福利视频网站| 国产精品久久久久久久久图文区| 精品一区二区综合| 欧美高清一级片在线| 亚洲黄色av一区| 成人午夜av影视| 精品国产凹凸成av人导航| 日产国产高清一区二区三区| 91黄视频在线| 亚洲日本成人在线观看| 成人午夜免费视频| 国产欧美日韩在线看| 国产一区二区精品久久| 欧美嫩在线观看| 性做久久久久久| 欧洲一区二区三区在线| 亚洲日本青草视频在线怡红院| 成人久久久精品乱码一区二区三区 | 3d成人动漫网站| 亚洲成人av福利| 欧美日韩精品三区| 亚洲成在人线免费| 欧美偷拍一区二区| 亚洲永久精品国产| 色婷婷久久一区二区三区麻豆| 国产精品国产三级国产三级人妇| 成人理论电影网| 亚洲欧美怡红院| 色综合色狠狠综合色| 亚洲欧美一区二区三区国产精品 | 911精品国产一区二区在线| 天堂资源在线中文精品| 欧美美女网站色| 美女一区二区三区| 精品国产乱码久久久久久牛牛| 裸体一区二区三区| 精品国产露脸精彩对白| 狠狠色综合色综合网络| 国产亚洲欧美中文| 91在线小视频| 亚洲成人tv网| 日韩精品一区二区在线| 国产一区啦啦啦在线观看| 国产欧美一区视频| 色综合天天天天做夜夜夜夜做| 麻豆91在线播放免费| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 日韩小视频在线观看专区| 男人的天堂亚洲一区| 久久亚洲捆绑美女| 成人一区二区三区视频| 亚洲理论在线观看| 欧美一级欧美一级在线播放| 国内精品久久久久影院一蜜桃| 国产三级一区二区| 欧美性猛交一区二区三区精品| 日韩电影在线一区| 国产亚洲精品超碰| 一本大道久久a久久综合| 五月婷婷综合在线| 久久久久久97三级| 欧美四级电影网| 国产黄人亚洲片| 亚洲一区二区不卡免费| 日韩欧美国产综合在线一区二区三区| 国产做a爰片久久毛片| 亚洲精品久久久蜜桃| 精品日产卡一卡二卡麻豆| 国产成人午夜精品影院观看视频 | 国产精品资源在线| 亚洲一区中文在线| 亚洲精品一区二区在线观看| 色婷婷综合久久久久中文| 日精品一区二区| 中文字幕在线一区二区三区| 欧美精品第1页| 99视频热这里只有精品免费| 日日夜夜免费精品| 亚洲天堂2014| 精品成人在线观看| 欧美日韩中字一区| 不卡av免费在线观看| 久久99热这里只有精品| 亚洲精品videosex极品| 久久久久久久一区| 8x福利精品第一导航| 91看片淫黄大片一级在线观看| 久久成人精品无人区| 香蕉加勒比综合久久|