首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VT_VARIANT / VT_VECTOR型PROPVARIANT结构的初始化

VT_VARIANT / VT_VECTOR型PROPVARIANT结构的初始化
EN

Stack Overflow用户
提问于 2022-02-28 18:28:06
回答 2查看 183关注 0票数 0

我很好奇如何初始化VT_VARIANT \ VT_VECTOR类型的PROPVARIANT结构。我知道的一个现有模型是HeadingPairs属性集的DocumentSummaryInformation属性:

HeadingPairs属性以重复对VT_LPSTR (或VT_LPWSTR)和VT_I4值的形式存储为变体向量。

我知道各种Init函数,例如创建一个InitPropVariantFromStringAsVector _ VT_VECTOR _

如有任何帮助或建议,将不胜感激。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-28 21:20:04

没有现成的Win32函数来用PROPVARIANT值的向量初始化PROPVARIANT,这是正确的。您只需手动初始化它,即分配一个PROPVARIANT数组,然后将指向该数组的指针分配给PROPVARIANT::capropvar.pElems字段,将数组的长度分配给PROPVARIANT::capropvar.cElems字段,例如:

代码语言:javascript
复制
int count = ...;
PROPVARIANT *arr = (PROPVARIANT*) CoTaskMemAlloc(count * sizeof(PROPVARIANT));

// initialize array values as needed...

PROPVARIANT pv;
PropVariantInit(&pv);
      
pv.vt = VT_VECTOR | VT_VARIANT;
pv.capropvar.pElems = arr;
pv.capropvar.cElems = count;

// use pv as needed...

PropVariantClear(&pv);
票数 1
EN

Stack Overflow用户

发布于 2022-03-01 17:53:48

下面是一个基于雷米用解决方案编写的AutoHotkey的原型:

代码语言:javascript
复制
VariantVector := [{vt:0x001F, val:"hello world"}, {vt:0x0003, val:3}]
VarSetCapacity(PropVariant, 8 + 2 * A_PtrSize, 0)
InitPropVariatFromVariantAsVector(PropVariant, VariantVector)
; Do something here...
PropVariantClear(PropVariant)
return

InitPropVariatFromVariantAsVector(ByRef PropVariant, VariantVector) {
   static VT_VARIANT := 0x000C
   static VT_VECTOR  := 0x1000
   static Size := 8 + 2 * A_PtrSize
   
   NumPut(VT_VARIANT | VT_VECTOR,  PropVariant, 0, "UShort")
   NumPut(VariantVector.Count(), PropVariant, 8, "UInt")
   ptr := DllCall("Ole32\CoTaskMemAlloc", "UPtr", Size * VariantVector.Count(), "Ptr")
   NumPut(ptr, PropVariant, 8 + A_PtrSize, "Ptr")
   
   for Each, Variant in VariantVector {
      Offset := Size * (Each - 1)
      NumPut(Variant.vt,  ptr + 0, Offset, "UShort")
      Switch Variant.vt
      {
         Case 0x0003: NumPut(Variant.val, ptr + 0, Offset + 8, "Int")  ; VT_I4
         Case 0x001E: DllCall("Shlwapi\SHStrDup", "AStr", Variant.val, "Ptr", ptr + Offset + 8, "Int")  ; VT_LPSTR
         Case 0x001F: DllCall("Shlwapi\SHStrDup", "WStr", Variant.val, "Ptr", ptr + Offset + 8, "Int")  ; VT_LPWSTR
         Default: throw Exception(A_ThisFunc ": Unsupported Variant Type.", -1, Format("0x{:04X}", Variant.vt))
      }
   }
}

PropVariantClear(ByRef PropVariant) {
   return DllCall("Ole32\PropVariantClear", "Ptr", &PropVariant, "Int")
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71299491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档