初始化 VT_VARIANT 的 PROPVARIANT 结构 | VT_VECTOR 类型
Initialize PROPVARIANT structure of VT_VARIANT | VT_VECTOR type
我很好奇如何初始化 VT_VARIANT 的 PROPVARIANT 结构 | VT_VECTOR 类型。我知道的现有模型是 DocumentSummaryInformation 属性 集的 HeadingPairs
属性:
The HeadingPairs property is stored as a vector of variants, in repeating pairs of VT_LPSTR (or VT_LPWSTR) and VT_I4 values.
我知道各种 Init 函数,例如创建 VT_VECTOR 的 InitPropVariantFromStringAsVector
函数 | VT_LPWSTR propvariant,但是,据我所知,没有函数可以初始化 VT_VARIANT 的 PROPVARIANT 结构 | VT_VECTOR类型。
如有任何帮助或建议,我们将不胜感激。
谢谢。
您是正确的,没有 ready-made Win32 函数可以用 PROPVARIANT
值的向量初始化 PROPVARIANT
。您只需要手动初始化它,即分配一个 PROPVARIANT
数组,然后将指向该数组的指针分配给 PROPVARIANT::capropvar.pElems
字段,并将数组的长度分配给 PROPVARIANT::capropvar.cElems
字段,例如:
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);
这是一个基于 Remy 用 AutoHotkey 编写的原型:
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")
}
我很好奇如何初始化 VT_VARIANT 的 PROPVARIANT 结构 | VT_VECTOR 类型。我知道的现有模型是 DocumentSummaryInformation 属性 集的 HeadingPairs
属性:
The HeadingPairs property is stored as a vector of variants, in repeating pairs of VT_LPSTR (or VT_LPWSTR) and VT_I4 values.
我知道各种 Init 函数,例如创建 VT_VECTOR 的 InitPropVariantFromStringAsVector
函数 | VT_LPWSTR propvariant,但是,据我所知,没有函数可以初始化 VT_VARIANT 的 PROPVARIANT 结构 | VT_VECTOR类型。
如有任何帮助或建议,我们将不胜感激。
谢谢。
您是正确的,没有 ready-made Win32 函数可以用 PROPVARIANT
值的向量初始化 PROPVARIANT
。您只需要手动初始化它,即分配一个 PROPVARIANT
数组,然后将指向该数组的指针分配给 PROPVARIANT::capropvar.pElems
字段,并将数组的长度分配给 PROPVARIANT::capropvar.cElems
字段,例如:
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);
这是一个基于 Remy
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")
}