工作经验总结之_VARIANT变量用法

本文总结了_VARIANT变量在实际工作中的使用经验,包括其结构体tagCY的定义,如何通过enum指定存储数据类型,以及如何利用union存储不同类型的数据。建议使用_bstr_t进行类型转换,方便进行后续操作。
部署运行你感兴趣的模型镜像

工作经验总结之_VARIANT变量用法

 

typedef struct  tagCY{

结构体原型

typedef struct tagVARIANT {
 VARTYPE vt;//enum类型
 unsigned short wReserved1//保留字段;
 unsigned short wReserved2;
 unsigned short wReserved3;
 union//保存数据的结构(联合体类型采用覆盖技术)一次只能使用一种数据类型 
{
 unsigned char bVal; 
 short iVal; 
 long lVal; 
 float fltVal;.
 double dblVal;
 VARIANT_BOOL boolVal;//  0 == FALSE, -1 == TRUE 
typedef short VARIANT_BOOL;
 SCODE scode; // typedef long SCODE;
 CY cyVal; //  DATE date;
 BSTR bstrVal;// typedef OLECHAR* BSTR;// typedef WCHAR OLECHAR;// //typedef wchar_t WCHAR;// typedef unsigned short wchar_t;
 
 IUnknown FAR* punkVal; //用于COM接口
 IDispatch FAR* pdispVal; //用于COM接口
       SAFEARRAY FAR* parray; //
    // unsigned char FAR* pbVal;
 short FAR* piVal; 
 long FAR* plVal; 
 float FAR* pfltVal; 
 double FAR* pdblVal; 
 VARIANT_BOOL FAR* pboolVal; 
 SCODE FAR* pscode;
 CY FAR* pcyVal; 
 DATE FAR* pdate; 
 BSTR FAR* pbstrVal; 
 IUnknown FAR* FAR* ppunkVal; 
 IDispatch FAR* FAR* ppdispVal;
 SAFEARRAY FAR* FAR* pparray;//二级指针
 VARIANT FAR* pvarVal; 
 void FAR* byref;
 };
};
typedef struct FARSTRUCT tagVARIANT VARIANT;
typedef struct FARSTRUCT tagVARIANT VARIANTARG;

//第一部分是enum类型,用来说明存储的数据类型

//第二部分是union类型,用来存储一种数据(enum来指定的)

//使用初始化函数VariantInit( 

  VARIANTARG *  pvarg  

);

//使用方法是先设置要存储的数据类型,再存储到相应的类型中

//获取同样

使用最简单的方法是用_bstr_t(var)统一变成字符串类型再进行相应转换!

 

 

                         LONGLONG int64;
                     }CY;
 //typedef struct tagSAFEARRAY 
       //  {
       //  USHORT cDims;//数组的维数
       // USHORT fFeatures;//标志位
       //  USHORT cbElements;//数组中元素的大小
       //   USHORT cLocks;//
       //   USHORT handle;
       //   PVOID pvData;//存储数据
 //   SAFEARRAYBOUND rgsabound[1];//每一维的数组的下界数和数组元素个数
       //   }  SAFEARRAY;

您可能感兴趣的与本文相关的镜像

EmotiVoice

EmotiVoice

AI应用

EmotiVoice是由网易有道AI算法团队开源的一块国产TTS语音合成引擎,支持中英文双语,包含2000多种不同的音色,以及特色的情感合成功能,支持合成包含快乐、兴奋、悲伤、愤怒等广泛情感的语音。

static void on_properties_changed(GDBusConnection *conn, const gchar *sender_name, const gchar *object_path, const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data) { (void)conn; (void)sender_name; (void)user_data; printf("tiga---on_properties_changed...\n"); printf("tiga---interface_name=%s,signal_name=%s\n", interface_name, signal_name); // 确保是来自Properties接口的信号 if (g_strcmp0(interface_name, PROPERTIES_IFACE) != 0 || g_strcmp0(signal_name, "PropertiesChanged") != 0) { return; } // 解析参数:第一个参数是接口名,第二个是变化的属性字典,第三个是失效属性数组(这里忽略) const gchar *iface; GVariantIter *changed_props; GVariant *invalidated; g_variant_get(parameters, "(&sa{sv}as)", &iface, &changed_props, &invalidated); printf("tiga---iface=%s,changed_props=%s,invalidated=%s\n", iface, changed_props, invalidated); // 我们只关心Device1接口的属性变化 if (g_strcmp0(iface, DEVICE_IFACE) == 0) { gchar *key; GVariant *value; while (g_variant_iter_next(changed_props, "{&sv}", &key, &value)) { printf("tiga---key=%s\n", key); // 检查是否是Connected属性 if (g_strcmp0(key, "Connected") == 0) { gboolean connected = g_variant_get_boolean(value); g_print("device %s connect_state_change: %s\n", object_path, connected ? "connected" : "disconnected"); if(!connected) { system("hciconfig hci0 leadv"); } } g_variant_unref(value); } } g_variant_iter_free(changed_props); g_variant_unref(invalidated); } 检查此段代码,为什么最后释放时会报错:(process:1327): GLib-CRITICAL **: 01:01:54.039: g_atomic_ref_count_dec: assertion 'old_value > 0' failed
09-19
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值