gpt4 book ai didi

c++ - VARIANT 类型 punkVal 给出未定义的值?

转载 作者:搜寻专家 更新时间:2023-10-31 00:03:21 27 4
gpt4 key购买 nike

我使用几个 CComVariant 类型变量来存储接口(interface)指针。但是,有时我需要将接口(interface)指针作为 NULL 传递。在这种情况下,当我这样做时:

CComVariant vAData,vBData;
......
....
CComQIPtr<IBData> pAData = vAData.punkVal; //vAData is {0, VT_I4} when I pass NULL

CComQIPtr<IBData>pBData = vBData.punkVal; //vBData is {0, VT_I4} when I pass NULL

第一行失败并抛出异常,因为 vAData.punkVal = 0xffffffff00000000但是第二行没有错误地顺利通过并且它具有有效的 vBData.punkVal 值(0x0000000000000000)。

我想知道为什么两个 punkVal 都为 NULL 时却不同??有谁知道为什么会这样??这只会在 64 位机器上抛出异常。

最佳答案

关于 VARIANT 的一些附加信息:它们有点奇怪,因为它们是复合类型:它基本上是几种类型的 union ,每种类型(bstrVal、lVal、punkVal 等)的字段都在内存,以及指示哪个字段有效的 vt 字段。

您应该只尝试访问与 vt 值匹配的字段。所以如果vt是VT_BSTR,那么只有bstrVal是有效的; punkVal 是禁区。如果 vt 是 VT_I4,则只应使用 lVal 字段。

VT_EMPTY 表示“这个变体还没有被设置为任何值,所以不代表任何东西”;当 vt 为 VT_EMPTY 时,所有字段都是禁区 - 它们可能是之前恰好在堆栈中的任何垃圾 - 这就是您在这里看到的。

在 Win64 中,整数仍然是 32 位的,但指针是 64 位的。类型为 VT_I4 且值为 0 的变体会将表示整数的 32 位全部设置为 0,但变体中的其余内存可能是任何剩余的垃圾。如果您尝试将该内存视为 64 位指针 - 通过访问 punkVal - 那么您最终会得到一个由这 32 个 0 位组成的指针,但也来自从未正确初始化的相邻 32 位 - 这可能就是为什么您在这里看到了两种情况之间的差异。

在 Win32 中,你很幸运:指针与 int 的大小相同,所以如果你访问一个为 0 的 VT_I4 并读取 punkVal(你不应该这样做!),你最终会得到一个 NULL 指针那种情况。

关于c++ - VARIANT 类型 punkVal 给出未定义的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6292179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com