无法存储/检索SafeArray中的值

时间:2015-06-09 11:20:02

标签: c++ safearray

我是SAFE ARRAY概念的新手MSDN并没有多大帮助。我试图将安全数组传递给函数。

这是我的代码

void func2(__int64 *a)
{
    *a = 100000;
}
void func1(SAFEARRAY **saOfmem )\
{
    LONG  rgIndex = 0;
    __int64 memVal;
    func2(&memVal);
    SafeArrayPutElement(*saOfmem,&rgIndex,&memVal);

}

int _tmain(int argc, _TCHAR* argv[])
{
    SAFEARRAY *saOfmem;
    SAFEARRAYBOUND rgsabound[1];
    __int64 val;

    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = 1;
    saOfmem = SafeArrayCreate(VT_UI8 | VT_BYREF, 1, rgsabound);

    func1(&saOfmem);

    SafeArrayGetElement(saOfmem,0,&val);
    return 0;
}

不幸的是,安全数组中的值未更新。我做错了什么?

1 个答案:

答案 0 :(得分:4)

  1. 您不应该使用VT_BYREF,这意味着通过引用传递值。你有一个简单的int64数组,没有引用。

  2. 您应该使用非空索引(请参阅注释)。 SafeArrayGetElement要求POINTER索引数组,而不是整数作为第二个参数。

    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = 1;
    saOfmem = SafeArrayCreate(VT_UI8, 1, rgsabound); ///<< remove VT_BYREF
    
    func1(&saOfmem);
    
    LONG rgIndex = 0; // <<< use non-null as parameter
    SafeArrayGetElement(saOfmem, &rgIndex, &val);