COM技术中的VARIANT and VARIANTARG

VARIANT and VARIANTARG

Use VARIANTARG to describe arguments passed within DISPPARAMS, and VARIANT to specify variant data that cannot be passed by reference. When a variant refers to another variant by using the VT_VARIANT | VT_BYREF vartype, the variant being referred to cannot also be of type VT_VARIANT | VT_BYREF. VARIANTs can be passed by value, even if VARIANTARGs cannot. The following definition of VARIANT is described in OAIDL.H automation header file:

typedef struct FARSTRUCT tagVARIANT VARIANT;
typedef struct FARSTRUCT tagVARIANT VARIANTARG;

typedef struct tagVARIANT  {
   VARTYPE vt;
   unsigned short wReserved1;
   unsigned short wReserved2;
   unsigned short wReserved3;
   union {
      Byte                    bVal;                 // VT_UI1.
      Short                   iVal;                 // VT_I2.
      long                    lVal;                 // VT_I4.
      float                   fltVal;               // VT_R4.
      double                  dblVal;               // VT_R8.
      VARIANT_BOOL            boolVal;              // VT_BOOL.
      SCODE                   scode;                // VT_ERROR.
      CY                      cyVal;                // VT_CY.
      DATE                    date;                 // VT_DATE.
      BSTR                    bstrVal;              // VT_BSTR.
      DECIMAL                 FAR* pdecVal          // VT_BYREF|VT_DECIMAL.
      IUnknown                FAR* punkVal;         // VT_UNKNOWN.
      IDispatch               FAR* pdispVal;        // VT_DISPATCH.
      SAFEARRAY               FAR* parray;          // VT_ARRAY|*.
      Byte                    FAR* pbVal;           // VT_BYREF|VT_UI1.
      short                   FAR* piVal;           // VT_BYREF|VT_I2.
      long                    FAR* plVal;           // VT_BYREF|VT_I4.
      float                   FAR* pfltVal;         // VT_BYREF|VT_R4.
      double                  FAR* pdblVal;         // VT_BYREF|VT_R8.
      VARIANT_BOOL            FAR* pboolVal;        // VT_BYREF|VT_BOOL.
      SCODE                   FAR* pscode;          // VT_BYREF|VT_ERROR.
      CY                      FAR* pcyVal;          // VT_BYREF|VT_CY.
      DATE                    FAR* pdate;           // VT_BYREF|VT_DATE.
      BSTR                    FAR* pbstrVal;        // VT_BYREF|VT_BSTR.
      IUnknown                FAR* FAR* ppunkVal;   // VT_BYREF|VT_UNKNOWN.
      IDispatch               FAR* FAR* ppdispVal;  // VT_BYREF|VT_DISPATCH.
      SAFEARRAY               FAR* FAR* pparray;    // VT_ARRAY|*.
      VARIANT                 FAR* pvarVal;         // VT_BYREF|VT_VARIANT.
      void                    FAR* byref;           // Generic ByRef.
      char                    cVal;                 // VT_I1.
      unsigned short          uiVal;                // VT_UI2.
      unsigned long           ulVal;                // VT_UI4.
      int                     intVal;               // VT_INT.
      unsigned int            uintVal;              // VT_UINT.
      char FAR *              pcVal;                // VT_BYREF|VT_I1.
      unsigned short FAR *    puiVal;               // VT_BYREF|VT_UI2.
      unsigned long FAR *     pulVal;               // VT_BYREF|VT_UI4.
      int FAR *               pintVal;              // VT_BYREF|VT_INT.
      unsigned int FAR *      puintVal;             //VT_BYREF|VT_UINT.
   };
};
 

To simplify extracting values from VARIANTARGs, Automation provides a set of functions for manipulating this type. Use of these functions is strongly recommended to ensure that applications apply consistent coercion rules.

The vt value governs the interpretation of the union as follows:

Value Description
VT_EMPTY No value was specified. If an optional argument to an Automation method is left blank, do not pass a VARIANT of type VT_EMPTY. Instead, pass a VARIANT of type VT_ERROR with a value of DISP_E_PARAMNOTFOUND.
VT_EMPTY | VT_BYREF Not valid.
VT_UI1 An unsigned 1-byte character is stored in bVal.
VT_UI1 | VT_BYREF A reference to an unsigned 1-byte character was passed. A pointer to the value is inpbVal.
VT_UI2 An unsigned 2-byte integer value is stored in uiVal.
VT_UI2 | VT_BYREF A reference to an unsigned 2-byte integer was passed. A pointer to the value is inpuiVal.
VT_UI4 An unsigned 4-byte integer value is stored in ulVal.
VT_UI4 | VT_BYREF A reference to an unsigend 4-byte integer was passed. A pointer to the value is inpulVal.
VT_UINT An unsigned integer value is stored in uintVal.
VT_UINT | VT_BYREF A reference to an unsigned integer value was passed. A pointer to the value is inpuintVal.
VT_INT An integer value is stored in intVal.
VT_INT | VT_BYREF A reference to an integer value was passed. A pointer to the value is inpintVal.
VT_I1 A 1-byte character value is stored in cVal.
VT_I1 | VT_BYREF A reference to a 1-byte character was passed. A pointer the value is inpcVal.
VT_I2 A 2-byte integer value is stored in iVal.
VT_I2 | VT_BYREF A reference to a 2-byte integer was passed. A pointer to the value is inpiVal.
VT_I4 A 4-byte integer value is stored in lVal.
VT_I4 | VT_BYREF A reference to a 4-byte integer was passed. A pointer to the value is inplVal.
VT_R4 An IEEE 4-byte real value is stored in fltVal.
VT_R4 | VT_BYREF A reference to an IEEE 4-byte real value was passed. A pointer to the value is inpfltVal.
VT_R8 An 8-byte IEEE real value is stored in dblVal.
VT_R8 | VT_BYREF A reference to an 8-byte IEEE real value was passed. A pointer to its value is inpdblVal.
VT_CY A currency value was specified. A currency number is stored as 64-bit (8-byte), two‘s complement integer, scaled by 10,000 to give a fixed-point number with 15 digits to the left of the decimal point and 4 digits to the right. The value is incyVal.
VT_CY | VT_BYREF A reference to a currency value was passed. A pointer to the value is inpcyVal.
VT_BSTR A string was passed; it is stored in bstrVal. This pointer must be obtained and freed by the BSTR functions, which are described inConversion and Manipulation Functions.
VT_BSTR | VT_BYREF A reference to a string was passed.A BSTR* that points to a BSTR is inpbstrVal.The referenced pointer must be obtained or freed by the BSTR functions.
VT_DECIMAL Decimal variables are stored as 96-bit (12-byte) unsigned integers scaled by a variable power of 10. VT_DECIMAL uses the entire 16 bytes of the Variant.
VT_DECIMAL | VT_BYREF A reference to a decimal value was passed. A pointer to the value is inpdecVal.
VT_NULL A propagating null value was specified. (This should not be confused with the null pointer.) The null value is used for tri-state logic, as with SQL.
VT_NULL | VT_BYREF Not valid.
VT_ERROR An SCODE was specified. The type of the error is specified in scodee. Generally, operations on error values should raise an exception or propagate the error to the return value, as appropriate.
VT_ERROR | VT_BYREF A reference to an SCODE was passed.A pointer to the value is inpscode.
VT_BOOL A 16 bit Boolean (True/False) value was specified. A value of 0xFFFF (all bits 1) indicates True; a value of 0 (all bits 0) indicates False. No other values are valid.
VT_BOOL | VT_BYREF A reference to a Boolean value. A pointer to the Boolean value is in pbool.
VT_DATE A value denoting a date and time was specified. Dates are represented as double-precision numbers, where midnight, January 1, 1900 is 2.0, January 2, 1900 is 3.0, and so on. The value is passed indate.

This is the same numbering system used by most spreadsheet programs, although some specify incorrectly that February 29, 1900 existed, and thus set January 1, 1900 to 1.0. The date can be converted to and from an MS-DOS representation usingVariantTimeToDosDateTime, which is discussed in Conversion and Manipulation Functions.

VT_DATE | VT_BYREF A reference to a date was passed.A pointer to the value is inpdate.
VT_DISPATCH A pointer to an object was specified.The pointer is inpdispVal.This object is known only to implement IDispatch. The object can be queried as to whether it supports any other desired interface by callingQueryInterface on the object.Objects that do not implementIDispatch should be passed using VT_UNKNOWN.
VT_DISPATCH | VT_BYREF A pointer to a pointer to an object was specified. The pointer to the object is stored in the location referred to byppdispVal.
VT_VARIANT Invalid. VARIANTARGs must be passed by reference.
VT_VARIANT | VT_BYREF A pointer to another VARIANTARG is passed in pvarVal. This referenced VARIANTARG,pvarVal, cannot be another VT_VARIANT|VT_BYREF. This value can be used to support languages that allow functions to change the types of variables passed by reference.
VT_UNKNOWN A pointer to an object that implements the IUnknown interface is passed in punkVal.
VT_UNKNOWN | VT_BYREF A pointer to the IUnknown interface is passed inppunkVal. The pointer to the interface is stored in the location referred to byppunkVal.
VT_ARRAY | <anything> An array of data type <anything> was passed. (VT_EMPTY and VT_NULL are invalid types to combine with VT_ARRAY.) The pointer inpparray points to an array descriptor, which describes the dimensions, size, and in-memory location of the array. The array descriptor is never accessed directly, but instead is read and modified using the functions described inConversion and Manipulation Functions.

原文地址:https://www.cnblogs.com/johnyang/p/12617881.html

时间: 2024-10-31 04:46:23

COM技术中的VARIANT and VARIANTARG的相关文章

《自动化技术中的进给电气运动》及学科学习笔记二

<自动化技术中的进给电气运动> 阅读内容:第1.3节 知识要点: 本节主要以不可调节电气传动系统为例,介绍了系统在时间域的静态和动态特性以及电气系统对于简单信号的响应. 1.采用微分方程分析系统 对于只有一个输入和输出的线性系统都可表示成如下的微分方程形式.其中u为输入,v为输出,且对于实际系统有m≤n. 以不可调电气传动系统为例,列出系统的机械和电气微分方程. (1)JGes=JM+JL (2)uA-eM=RAiA+LAdiA/dt (3)eM=cMωM (4)MM=ML+MB=ML+JGe

自动化技术中的进给电气传动研习笔记-1

1.调节技术基础 1.1术语和概念 1.1.1控制和调节 本节主要介绍的为控制和调节的联系.控制的核心特征是开环作用路径,即控制链路,换句话说就是输入量单方向决定了输出量.而调节的核心特征是闭环,即调节回路,强调反向作用和比较,输出了不断影响自身.同时为我们提供了控制调节系统的表达方式,即工作原理框图.而系统的静态特性和动态特性却存在着巨大的不同,静态特性表现为函数图线,而动态特性需要过渡函数或微分方程进行表达. 1.1.2调节回路型号 调节型号分为模拟信号,数字信号和二进制信号.这里尤其需要在

Xen虚拟化技术中PV和HVM的区别

转自 这里 Xen是一个开源的type-1或者裸机管理程序,它使得一个物理主机能够同时并行运行多个相同的或者不同的操作系统实例.Xen是目前唯一的开源可得的type-1管理程序.Xen被应用于许多商业和开源的应用程序中,比如:服务器虚拟化(server virtualization).基础设施即服务(Infrastructure as a Service).桌面虚拟化(desktop virtualization).安全应用程序(security applications).嵌入式和硬件设备(e

#前端杂谈 【Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?via知乎 张秋怡】

先附上链接:Web 建站技术中,HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.ASP.NET.Web Services 是什么? 这是分享自知乎用户张秋怡的一个回答,用通俗形象的语言解释了关于前端的一些基本概念,比较适合像我这种刚入门的小白阅读.

谈谈CSS预处理技术中for循环的应用-CSS Sprite

各种新技术的出现,推动着Web前端技术飞速发展,在提升用户体验的同时也方便开发者: 在前端优化时,我们使用CSSSprite技术,把多个图片合在一张图片上,然后通过background-image,background-position来定位现实不同效果,这样来达到减少HTTP请求,毕竟HTTP请求是相当昂贵的,但是HTTP请求是少了,开发人员工作量就大了,要定位图片不是一件很方便的事情,非常麻烦,要一个一个地计算: 其实我们可以有点技巧,让图片排列有点规律,这样可以减少大量时间: 假如我们的图

自动化技术中的进给电气传动-读书笔记3

1.3时间域描述 1.3.1 微分方程用来描述物理传递环节和系统的数学模型. 微分方程可以在一直输入量和边界条件的情况下计算出有关的输出量. 首先概括出物理规律性,然后建立起工作原理框图,推导出不可调传动系统的微分方程. 经过一系列的变换就可以得到不可调电气传动系统的二阶微分方程. 假定ML = 0,就可以解微分方程确定输出电压变化时的基准相应特性. 阶跃响应特性: 用来描述一个传递环节或一个系统的输出量在输入量发生一次阶跃式变化时的随时间变化过程. 可用来调节技术特性, 将微分方程简化: 在线

JAVA之IO技术中对指定存在的文件进行续写

package ioTest.io1; import java.io.FileWriter; /* * 对已有文件中的数据进行续写 * 为了方便处理,这里面的异常都直接抛出 */ public class FileWriterDemo2 { public static void main(String[] args) throws Exception { //参数true,确定了对指定存在的文件进行续写,而不是替换其中的内容. FileWriter fWriter=new FileWriter(

转:Delphi数据库技术中Disablecontrols和Enablecontrols的功能

Delphi数据库技术中Disablecontrols和Enablecontrols的功能  2010-12-06 10:48:43|  分类: delphi技术 |  标签:disablecontrols  enablecontrols   |字号大中小 订阅 一般来说,用来扫描整个数据库表并修改每个记录的某一个字段的程序如下所示:with Table DobeginDisableControls;{在修改记录的过程中,使其它部件无效}First; {将记录指针指向第一条记录} while n

变量存取范围及JSP、JSTL和Struts技术中变量的存取方法

JSP中变量的定义范围实际有5种:本地范围,页面范围(page),请求范围(request),会话范围(session)和应用程序范围(application). 以下介绍在各种技术中的变量存取方法. u       JSP中: 存储: 本地范围变量直接定义,如: String name="name in page"; page范围变量保存在pageContext隐式对象中,如: pageContext.setAttribute("nameContext",&quo