Data Access IDL Specification(OPC2.0规范)

The current files require MIDL compiler 3.00.15 or later and the WIN NT 4.0 release SDK.

Use the command line MIDL //Oicf opcda.idl.

The resulting  OPCDA.H  file should be included in all clients and servers.

The resulting  OPCDA_I.C  file defines the interface IDs and should be linked into all clients and servers.

NOTE: This IDL file and the Proxy/Stub generated from it should NEVER be modified in any way. If you add vendor specific interfaces to your server (which is allowed) you must generate a SEPARATE vendor specific IDL file to describe only those interfaces and a separate vendor specific ProxyStub DLL to marshall only those interfaces.

Note: See the OPC Overview document (OPCOVW.DOC) for a listing and disucssion of OPCCOMN.IDL.

 

// OPCDA.IDL

// REVISION:  6/17/98 04:00 PM (EST)

// VERSIONINFO    2.0.0.0

// 12/05/97 acc fixed UNCERTAIN bits, add AsyncIO2, OPCDataCallback,

//                OPCItemProperties,  BROWSE_TO

// 06/19/98 acc change V2 uuids prior to final release

//              to avoid conflict with 'old' OPCDA Automation uuids

//              Change name of 3 methods on AsyncIO2 to

//              Cancel2,SetEnable,GetEnable to eliminate conflicts

//

 

import "oaidl.idl" ;

 

typedef enum tagOPCDATASOURCE {

    OPC_DS_CACHE = 1,

    OPC_DS_DEVICE } OPCDATASOURCE ;

 

typedef enum tagOPCBROWSETYPE {

    OPC_BRANCH = 1,

    OPC_LEAF,

    OPC_FLAT} OPCBROWSETYPE;

 

typedef enum tagOPCNAMESPACETYPE {

    OPC_NS_HIERARCHIAL = 1,

    OPC_NS_FLAT} OPCNAMESPACETYPE;

 

typedef enum tagOPCBROWSEDIRECTION {

    OPC_BROWSE_UP = 1,

    OPC_BROWSE_DOWN, OPC_BROWSE_TO} OPCBROWSEDIRECTION;

 

// **NOTE** the 1.0 IDL contained an error for ACCESSRIGHTS.

// They should not have been an ENUM.

// They should have been two mask bits as noted here.

cpp_quote("#define OPC_READABLE    1")

cpp_quote("#define OPC_WRITEABLE   2")

 

typedef enum tagOPCEUTYPE {

    OPC_NOENUM = 0,

    OPC_ANALOG,

    OPC_ENUMERATED } OPCEUTYPE;

 

typedef enum tagOPCSERVERSTATE {

    OPC_STATUS_RUNNING = 1,

    OPC_STATUS_FAILED,

    OPC_STATUS_NOCONFIG,

    OPC_STATUS_SUSPENDED,

    OPC_STATUS_TEST } OPCSERVERSTATE;

 

typedef enum tagOPCENUMSCOPE { OPC_ENUM_PRIVATE_CONNECTIONS = 1,

    OPC_ENUM_PUBLIC_CONNECTIONS,

    OPC_ENUM_ALL_CONNECTIONS,

    OPC_ENUM_PRIVATE,

    OPC_ENUM_PUBLIC,

    OPC_ENUM_ALL } OPCENUMSCOPE;

 

typedef DWORD OPCHANDLE;

 

typedef struct tagOPCGROUPHEADER {

    DWORD       dwSize;

    DWORD       dwItemCount;

    OPCHANDLE   hClientGroup;

    DWORD       dwTransactionID;

    HRESULT     hrStatus;

} OPCGROUPHEADER;

 

typedef struct tagOPCITEMHEADER1 {

    OPCHANDLE   hClient;

    DWORD       dwValueOffset;

    WORD        wQuality;

    WORD        wReserved;

    FILETIME    ftTimeStampItem;

} OPCITEMHEADER1;

 

typedef struct tagOPCITEMHEADER2 {

    OPCHANDLE   hClient;

    DWORD       dwValueOffset;

    WORD        wQuality;

    WORD        wReserved;

} OPCITEMHEADER2;

 

typedef struct tagOPCGROUPHEADERWRITE {

    DWORD       dwItemCount;

    OPCHANDLE   hClientGroup;

    DWORD       dwTransactionID;

    HRESULT     hrStatus;

} OPCGROUPHEADERWRITE;

 

typedef struct tagOPCITEMHEADERWRITE {

    OPCHANDLE   hClient;

    HRESULT     dwError;

} OPCITEMHEADERWRITE;

 

typedef struct tagOPCITEMSTATE{

    OPCHANDLE   hClient;

    FILETIME    ftTimeStamp;

    WORD        wQuality;

    WORD        wReserved;

    VARIANT     vDataValue;

} OPCITEMSTATE;

 

typedef struct tagOPCSERVERSTATUS {

           FILETIME       ftStartTime;

           FILETIME       ftCurrentTime;

           FILETIME       ftLastUpdateTime;

           OPCSERVERSTATE dwServerState;

           DWORD          dwGroupCount;

           DWORD          dwBandWidth;

           WORD           wMajorVersion;

           WORD           wMinorVersion;

           WORD           wBuildNumber;

           WORD           wReserved;

  [string] LPWSTR         szVendorInfo;

} OPCSERVERSTATUS;

 

typedef struct tagOPCITEMDEF {

  [string]              LPWSTR     szAccessPath;

  [string]              LPWSTR     szItemID;

                        BOOL       bActive ;

                        OPCHANDLE  hClient;

                        DWORD      dwBlobSize;

  [size_is(dwBlobSize)] BYTE     * pBlob;

                        VARTYPE    vtRequestedDataType;

                        WORD       wReserved;

} OPCITEMDEF;

 

typedef struct tagOPCITEMATTRIBUTES {

  [string]              LPWSTR     szAccessPath;

  [string]              LPWSTR     szItemID;

                        BOOL       bActive;

                        OPCHANDLE  hClient;

                        OPCHANDLE  hServer;

                        DWORD      dwAccessRights;

                        DWORD      dwBlobSize;

  [size_is(dwBlobSize)] BYTE     * pBlob;

                        VARTYPE    vtRequestedDataType;

                        VARTYPE    vtCanonicalDataType;

                        OPCEUTYPE  dwEUType;

                        VARIANT    vEUInfo;

} OPCITEMATTRIBUTES;

 

typedef struct tagOPCITEMRESULT {

                        OPCHANDLE  hServer;

                        VARTYPE    vtCanonicalDataType;

                        WORD       wReserved;

                        DWORD      dwAccessRights;

                        DWORD      dwBlobSize;

  [size_is(dwBlobSize)] BYTE     * pBlob;

} OPCITEMRESULT;

 

 

//****************************************************

// OPC Quality flags

//

// Masks for extracting quality subfields

// (note 'status' mask also includes 'Quality' bits)

//

cpp_quote("#define    OPC_QUALITY_MASK            0xC0")

cpp_quote("#define    OPC_STATUS_MASK             0xFC")

cpp_quote("#define    OPC_LIMIT_MASK              0x03")

 

// Values for QUALITY_MASK bit field

//

cpp_quote("#define    OPC_QUALITY_BAD             0x00")

cpp_quote("#define    OPC_QUALITY_UNCERTAIN       0x40")

cpp_quote("#define    OPC_QUALITY_GOOD            0xC0")

 

// STATUS_MASK Values for Quality = BAD

//

cpp_quote("#define    OPC_QUALITY_CONFIG_ERROR    0x04")

cpp_quote("#define    OPC_QUALITY_NOT_CONNECTED   0x08")

cpp_quote("#define    OPC_QUALITY_DEVICE_FAILURE  0x0c")

cpp_quote("#define    OPC_QUALITY_SENSOR_FAILURE  0x10")

cpp_quote("#define    OPC_QUALITY_LAST_KNOWN      0x14")

cpp_quote("#define    OPC_QUALITY_COMM_FAILURE    0x18")

cpp_quote("#define    OPC_QUALITY_OUT_OF_SERVICE  0x1C")

 

// STATUS_MASK Values for Quality = UNCERTAIN

//

cpp_quote("#define    OPC_QUALITY_LAST_USABLE     0x44")

cpp_quote("#define    OPC_QUALITY_SENSOR_CAL      0x50")

cpp_quote("#define    OPC_QUALITY_EGU_EXCEEDED    0x54")

cpp_quote("#define    OPC_QUALITY_SUB_NORMAL      0x58")

 

// STATUS_MASK Values for Quality = GOOD

//

cpp_quote("#define    OPC_QUALITY_LOCAL_OVERRIDE  0xD8")

 

 

// Values for Limit Bitfield

//

cpp_quote("#define    OPC_LIMIT_OK                0x00")

cpp_quote("#define    OPC_LIMIT_LOW               0x01")

cpp_quote("#define    OPC_LIMIT_HIGH              0x02")

cpp_quote("#define    OPC_LIMIT_CONST             0x03")

 

//****************************************************

//Interface Definitions

//

//****************************************************

[

  object,

  uuid(39c13a4d-011e-11d0-9675-0020afd8adb3),

  pointer_default(unique)

]

interface IOPCServer : IUnknown

{

  HRESULT AddGroup(

    [in, string]        LPCWSTR     szName,

    [in]                BOOL        bActive,

    [in]                DWORD       dwRequestedUpdateRate,

    [in]                OPCHANDLE   hClientGroup,

    [unique, in]        LONG      * pTimeBias,

    [unique, in]        FLOAT     * pPercentDeadband,

    [in]                DWORD       dwLCID,

    [out]               OPCHANDLE * phServerGroup,

    [out]               DWORD     * pRevisedUpdateRate,

    [in]                REFIID      riid,

    [out, iid_is(riid)] LPUNKNOWN * ppUnk

    );

 

  HRESULT GetErrorString(

    [in]          HRESULT  dwError,

    [in]          LCID     dwLocale,

    [out, string] LPWSTR * ppString

    );

 

  HRESULT GetGroupByName(

    [in, string]        LPCWSTR szName,

    [in]                REFIID riid,

    [out, iid_is(riid)] LPUNKNOWN * ppUnk

    );

 

  HRESULT GetStatus(

    [out] OPCSERVERSTATUS ** ppServerStatus

    );

 

  HRESULT RemoveGroup(

    [in] OPCHANDLE hServerGroup,

    [in] BOOL      bForce

    );

 

  HRESULT CreateGroupEnumerator(

    [in] OPCENUMSCOPE dwScope,

    [in] REFIID       riid,

    [out, iid_is(riid)] LPUNKNOWN* ppUnk

    );

 

}

 

//****************************************************

[

  object,

  uuid(39c13a4e-011e-11d0-9675-0020afd8adb3),

  pointer_default(unique)

]

interface IOPCServerPublicGroups : IUnknown

{

  HRESULT GetPublicGroupByName(

    [in, string]        LPCWSTR     szName,

    [in]                REFIID      riid,

    [out, iid_is(riid)] LPUNKNOWN * ppUnk

    );

 

  HRESULT RemovePublicGroup(

    [in] OPCHANDLE hServerGroup,

    [in] BOOL      bForce

    );

}

 

 

//****************************************************

[

  object,

  uuid(39c13a4f-011e-11d0-9675-0020afd8adb3),

  pointer_default(unique)

]

interface IOPCBrowseServerAddressSpace: IUnknown

{

  HRESULT QueryOrganization(

    [out] OPCNAMESPACETYPE  * pNameSpaceType

    );

 

  HRESULT ChangeBrowsePosition(

    [in]         OPCBROWSEDIRECTION dwBrowseDirection, 

    [in, string] LPCWSTR            szString

    );

 

  HRESULT BrowseOPCItemIDs(

    [in]         OPCBROWSETYPE   dwBrowseFilterType,

    [in, string] LPCWSTR         szFilterCriteria, 

    [in]         VARTYPE         vtDataTypeFilter,    

    [in]         DWORD           dwAccessRightsFilter,

    [out]        LPENUMSTRING  * ppIEnumString

    );       

 

  HRESULT GetItemID(

    [in]          LPWSTR   szItemDataID,

    [out, string] LPWSTR * szItemID

    );

 

  HRESULT BrowseAccessPaths(

    [in, string] LPCWSTR        szItemID, 

    [out]        LPENUMSTRING * ppIEnumString

    );

}

 

 

 

//****************************************************

[

  object,

  uuid(39c13a50-011e-11d0-9675-0020afd8adb3),

  pointer_default(unique)

]

interface IOPCGroupStateMgt : IUnknown

{

  HRESULT GetState(

    [out]         DWORD     * pUpdateRate,

    [out]         BOOL      * pActive,

    [out, string] LPWSTR    * ppName,

    [out]         LONG      * pTimeBias,

    [out]         FLOAT     * pPercentDeadband,

    [out]         DWORD     * pLCID,

    [out]         OPCHANDLE * phClientGroup,

    [out]         OPCHANDLE * phServerGroup

    );

 

  HRESULT SetState(

    [unique, in]  DWORD     * pRequestedUpdateRate,

    [out]         DWORD     * pRevisedUpdateRate,

    [unique, in]  BOOL      * pActive,

    [unique, in]  LONG      * pTimeBias,

    [unique, in]  FLOAT     * pPercentDeadband,

    [unique, in]  DWORD     * pLCID,

    [unique, in]  OPCHANDLE * phClientGroup

    );

 

  HRESULT SetName(

    [in, string] LPCWSTR szName

    );

 

  HRESULT CloneGroup(

    [in, string]        LPCWSTR     szName,

    [in]                REFIID      riid,

    [out, iid_is(riid)] LPUNKNOWN * ppUnk

    );

}

 

 

 

//****************************************************

[

  object,

  uuid(39c13a51-011e-11d0-9675-0020afd8adb3),

  pointer_default(unique)

]

interface IOPCPublicGroupStateMgt : IUnknown

{

  HRESULT GetState(

    [out] BOOL * pPublic

    );

 

  HRESULT MoveToPublic(

    void

    );

}

 

 

 

//****************************************************

[

  object,

  uuid(39c13a52-011e-11d0-9675-0020afd8adb3),

  pointer_default(unique)

]

interface IOPCSyncIO : IUnknown

{

  HRESULT Read(

    [in]                        OPCDATASOURCE   dwSource,

    [in]                        DWORD           dwCount,

    [in, size_is(dwCount)]      OPCHANDLE     * phServer,

    [out, size_is(,dwCount)]    OPCITEMSTATE ** ppItemValues,

    [out, size_is(,dwCount)]    HRESULT      ** ppErrors

    );

 

  HRESULT Write(

    [in]                        DWORD        dwCount,

    [in, size_is(dwCount)]      OPCHANDLE  * phServer,

    [in, size_is(dwCount)]      VARIANT    * pItemValues,

    [out, size_is(,dwCount)]    HRESULT   ** ppErrors

    );

}

 

//****************************************************

[

  object,

  uuid(39c13a53-011e-11d0-9675-0020afd8adb3),

  pointer_default(unique)

]

interface IOPCAsyncIO : IUnknown

{

  HRESULT Read(

    [in]                        DWORD           dwConnection,

    [in]                        OPCDATASOURCE   dwSource,

    [in]                        DWORD           dwCount,

    [in, size_is(dwCount)]      OPCHANDLE     * phServer,

    [out]                       DWORD         * pTransactionID,

    [out, size_is(,dwCount)]    HRESULT      ** ppErrors

    );

 

  HRESULT Write(

    [in]                        DWORD       dwConnection,

    [in]                        DWORD       dwCount,

    [in, size_is(dwCount)]      OPCHANDLE * phServer,

    [in, size_is(dwCount)]      VARIANT   * pItemValues,

    [out]                       DWORD     * pTransactionID,

    [out, size_is(,dwCount)]    HRESULT  ** ppErrors

    );

 

 

  HRESULT Refresh(

    [in]  DWORD           dwConnection,

    [in]  OPCDATASOURCE   dwSource,

    [out] DWORD         * pTransactionID

    );

 

  HRESULT Cancel(

    [in] DWORD dwTransactionID

    );

 

}

 

 

//****************************************************

[

  object,

  uuid(39c13a54-011e-11d0-9675-0020afd8adb3),

  pointer_default(unique)

]

interface IOPCItemMgt: IUnknown

{

  HRESULT AddItems(

    [in]                        DWORD            dwCount,

    [in, size_is(dwCount)]      OPCITEMDEF     * pItemArray,

    [out, size_is(,dwCount)]    OPCITEMRESULT ** ppAddResults,

    [out, size_is(,dwCount)]    HRESULT       ** ppErrors

    );

 

  HRESULT ValidateItems(

    [in]                        DWORD             dwCount,

    [in, size_is(dwCount)]      OPCITEMDEF      * pItemArray,

    [in]                        BOOL              bBlobUpdate,

    [out, size_is(,dwCount)]    OPCITEMRESULT  ** ppValidationResults,

    [out, size_is(,dwCount)]    HRESULT        ** ppErrors

    );

 

  HRESULT RemoveItems(

    [in]                        DWORD        dwCount,

    [in, size_is(dwCount)]      OPCHANDLE  * phServer,

    [out, size_is(,dwCount)]    HRESULT   ** ppErrors

    );

 

  HRESULT SetActiveState(

    [in]                        DWORD        dwCount,

    [in, size_is(dwCount)]      OPCHANDLE  * phServer,

    [in]                        BOOL         bActive,

    [out, size_is(,dwCount)]    HRESULT   ** ppErrors

    );

 

  HRESULT SetClientHandles(

    [in]                        DWORD        dwCount,

    [in, size_is(dwCount)]      OPCHANDLE  * phServer,

    [in, size_is(dwCount)]      OPCHANDLE  * phClient,

    [out, size_is(,dwCount)]    HRESULT   ** ppErrors

    );

 

  HRESULT SetDatatypes(

    [in]                        DWORD        dwCount,

    [in, size_is(dwCount)]      OPCHANDLE  * phServer,

    [in, size_is(dwCount)]      VARTYPE    * pRequestedDatatypes,

    [out, size_is(,dwCount)]    HRESULT   ** ppErrors

    );

 

  HRESULT CreateEnumerator(

    [in]                REFIID      riid,

    [out, iid_is(riid)] LPUNKNOWN * ppUnk

    );

}

 

 

//****************************************************

[

  object,

  uuid(39c13a55-011e-11d0-9675-0020afd8adb3),

  pointer_default(unique)

]

interface IEnumOPCItemAttributes : IUnknown

{

  HRESULT Next(

    [in]  ULONG celt,

    [out, size_is(,*pceltFetched)] OPCITEMATTRIBUTES ** ppItemArray,

    [out] ULONG * pceltFetched

    );

 

  HRESULT Skip(

    [in] ULONG celt

    );

 

  HRESULT Reset(

    void

    );

 

  HRESULT Clone(

    [out] IEnumOPCItemAttributes ** ppEnumItemAttributes

    );

}

 

 

// Data Access V2.0 additions

[

  object,

  uuid(39c13a70-011e-11d0-9675-0020afd8adb3),

  pointer_default(unique)

]

interface IOPCDataCallback : IUnknown

{

HRESULT OnDataChange(

    [in]                 DWORD       dwTransid,

    [in]                 OPCHANDLE   hGroup,

    [in]                 HRESULT     hrMasterquality,

    [in]                 HRESULT     hrMastererror,

    [in]                 DWORD       dwCount,

    [in, size_is(dwCount)] OPCHANDLE * phClientItems,

    [in, size_is(dwCount)] VARIANT   * pvValues,

    [in, size_is(dwCount)] WORD      * pwQualities,

    [in, size_is(dwCount)] FILETIME  * pftTimeStamps,

    [in, size_is(dwCount)] HRESULT   * pErrors

);

 

  HRESULT OnReadComplete(

    [in]                 DWORD       dwTransid,

    [in]                 OPCHANDLE   hGroup,

    [in]                 HRESULT     hrMasterquality,

    [in]                 HRESULT     hrMastererror,

    [in]                 DWORD       dwCount,

    [in, size_is(dwCount)] OPCHANDLE * phClientItems,

    [in, size_is(dwCount)] VARIANT   * pvValues,

    [in, size_is(dwCount)] WORD      * pwQualities,

    [in, size_is(dwCount)] FILETIME  * pftTimeStamps,

    [in, size_is(dwCount)] HRESULT   * pErrors

);

 

  HRESULT OnWriteComplete(

    [in]                 DWORD       dwTransid,

    [in]                 OPCHANDLE   hGroup,

    [in]                 HRESULT     hrMastererr,

    [in]                 DWORD       dwCount,

    [in, size_is(dwCount)] OPCHANDLE * pClienthandles,

    [in, size_is(dwCount)] HRESULT   * pErrors

);

 

  HRESULT OnCancelComplete(

    [in]                 DWORD       dwTransid,

    [in]                 OPCHANDLE   hGroup

);

 

}

 

//****************************************************

[

  object,

  uuid(39c13a71-011e-11d0-9675-0020afd8adb3),

  pointer_default(unique)

]

interface IOPCAsyncIO2 : IUnknown

{

  HRESULT Read(

    [in]                        DWORD           dwCount,

    [in, size_is(dwCount)]      OPCHANDLE     * phServer,

    [in]                        DWORD           dwTransactionID,

    [out]                       DWORD         * pdwCancelID,

    [out, size_is(,dwCount)]    HRESULT      ** ppErrors

    );

 

  HRESULT Write(

    [in]                        DWORD           dwCount,

    [in, size_is(dwCount)]      OPCHANDLE     * phServer,

    [in, size_is(dwCount)]      VARIANT       * pItemValues,

    [in]                        DWORD           dwTransactionID,

    [out]                       DWORD         * pdwCancelID,

    [out, size_is(,dwCount)]    HRESULT      ** ppErrors

    );

 

 

  HRESULT Refresh2(

    [in]                        OPCDATASOURCE   dwSource,

    [in]                        DWORD           dwTransactionID,

    [out]                       DWORD         * pdwCancelID

    );

 

  HRESULT Cancel2(

    [in]                        DWORD           dwCancelID

    );

 

  HRESULT SetEnable(

    [in]                        BOOL            bEnable

    );

 

  HRESULT GetEnable(

    [out]                       BOOL           *pbEnable

    );

 

}

 

 

//****************************************************

[

  object,

  uuid(39c13a72-011e-11d0-9675-0020afd8adb3),

  pointer_default(unique)

]

interface IOPCItemProperties : IUnknown

{

  HRESULT QueryAvailableProperties (

    [in]                          LPWSTR     szItemID,

    [out]                         DWORD    * pdwCount,

    [out, size_is(,*pdwCount)]    DWORD   ** ppPropertyIDs,

    [out, size_is(,*pdwCount)]    LPWSTR  ** ppDescriptions,

    [out, size_is(,*pdwCount)]    VARTYPE ** ppvtDataTypes

);

 

  HRESULT GetItemProperties (

    [in]                         LPWSTR     szItemID,

    [in]                         DWORD      dwCount,

    [in, size_is(dwCount)]       DWORD    * pdwPropertyIDs,

    [out, size_is(,dwCount)]     VARIANT ** ppvData,

    [out, size_is(,dwCount)]     HRESULT ** ppErrors

);

 

  HRESULT LookupItemIDs(

    [in]                         LPWSTR     szItemID,

    [in]                         DWORD      dwCount,

    [in, size_is(dwCount)]       DWORD    * pdwPropertyIDs,

    [out, string, size_is(,dwCount)] LPWSTR ** ppszNewItemIDs,

    [out, size_is(,dwCount)]     HRESULT ** ppErrors

);

}

 

 

// This TYPELIB is generated as a convenience to users of high level tools

// which are capable of using or browsing TYPELIBs.

// 'Smart Pointers' in VC5 is one example.

[

    uuid(B28EEDB2-AC6F-11d1-84D5-00608CB8A7E9),

    version(1.0),

    helpstring("OPCDA 2.0 Type Library")

]

library OPCDA

{

    importlib("stdole32.tlb");

    importlib("stdole2.tlb");

 

    interface IOPCServer ;

    interface IOPCServerPublicGroups ;

    interface IOPCBrowseServerAddressSpace;

    interface IOPCGroupStateMgt ;

    interface IOPCPublicGroupStateMgt ;

    interface IOPCSyncIO ;

    interface IOPCAsyncIO ;

    interface IOPCItemMgt;

    interface IEnumOPCItemAttributes ;

    interface IOPCDataCallback ;

    interface IOPCAsyncIO2 ;

    interface IOPCItemProperties ;

 

};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值