Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何访问C+;中COM对象返回的变量数据类型中的安全数组+;?_C++_Arrays_Com_Variant_Safearray - Fatal编程技术网

C++ 如何访问C+;中COM对象返回的变量数据类型中的安全数组+;?

C++ 如何访问C+;中COM对象返回的变量数据类型中的安全数组+;?,c++,arrays,com,variant,safearray,C++,Arrays,Com,Variant,Safearray,我正在使用COM对象。我调用COM对象的函数,该函数返回包含设备列表安全数组的变量数据类型。 我如何使用此变体来访问我的设备的安全装备 VARIANT namList; SAFEARRAY* myequip; namList=str->GetNames(); 为了在这样的变体中使用SAFEARRAY,您需要进行大量的验证和错误检查。这是你需要遵循的大致模式。请仔细阅读评论,因为我对您正在使用的COM API做了一些假设 // verify that it's an arra

我正在使用COM对象。我调用COM对象的函数,该函数返回包含设备列表安全数组的变量数据类型。 我如何使用此变体来访问我的设备的安全装备

  VARIANT namList; 
  SAFEARRAY* myequip;
  namList=str->GetNames();

为了在这样的变体中使用SAFEARRAY,您需要进行大量的验证和错误检查。这是你需要遵循的大致模式。请仔细阅读评论,因为我对您正在使用的COM API做了一些假设

// verify that it's an array
if (V_ISARRAY(&namList))
{
    // get safe array
    LPSAFEARRAY pSafeArray = V_ARRAY(&namList);

    // determine the type of item in the array
    VARTYPE itemType;
    if (SUCCEEDED(SafeArrayGetVartype(pSafeArray, &itemType)))
    {
        // verify it's the type you expect
        // (The API you're using probably returns a safearray of VARIANTs,
        // so I'll use VT_VARIANT here. You should double-check this.)
        if (itemType == VT_VARIANT)
        {
            // verify that it's a one-dimensional array
            // (The API you're using probably returns a one-dimensional array.)
            if (SafeArrayGetDim(pSafeArray) == 1)
            {
                // determine the upper and lower bounds of the first dimension
                LONG lBound;
                LONG uBound;
                if (SUCCEEDED(SafeArrayGetLBound(pSafeArray, 1, &lBound)) && SUCCEEDED(SafeArrayGetUBound(pSafeArray, 1, &uBound)))
                {
                    // determine the number of items in the array
                    LONG itemCount = uBound - lBound + 1;

                    // begin accessing data
                    LPVOID pData;
                    if (SUCCEEDED(SafeArrayAccessData(pSafeArray, &pData)))
                    {
                        // here you can cast pData to an array (pointer) of the type you expect
                        // (The API you're using probably returns a safearray of VARIANTs,
                        // so I'll use VARIANT here. You should double-check this.)
                        VARIANT* pItems = (VARIANT*)pData;

                        // use the data here.

                        // end accessing data
                        SafeArrayUnaccessData(pSafeArray);
                    }
                }
            }
        }
    }
}

为了在这样的变体中使用SAFEARRAY,您需要进行大量的验证和错误检查。这是你需要遵循的大致模式。请仔细阅读评论,因为我对您正在使用的COM API做了一些假设

// verify that it's an array
if (V_ISARRAY(&namList))
{
    // get safe array
    LPSAFEARRAY pSafeArray = V_ARRAY(&namList);

    // determine the type of item in the array
    VARTYPE itemType;
    if (SUCCEEDED(SafeArrayGetVartype(pSafeArray, &itemType)))
    {
        // verify it's the type you expect
        // (The API you're using probably returns a safearray of VARIANTs,
        // so I'll use VT_VARIANT here. You should double-check this.)
        if (itemType == VT_VARIANT)
        {
            // verify that it's a one-dimensional array
            // (The API you're using probably returns a one-dimensional array.)
            if (SafeArrayGetDim(pSafeArray) == 1)
            {
                // determine the upper and lower bounds of the first dimension
                LONG lBound;
                LONG uBound;
                if (SUCCEEDED(SafeArrayGetLBound(pSafeArray, 1, &lBound)) && SUCCEEDED(SafeArrayGetUBound(pSafeArray, 1, &uBound)))
                {
                    // determine the number of items in the array
                    LONG itemCount = uBound - lBound + 1;

                    // begin accessing data
                    LPVOID pData;
                    if (SUCCEEDED(SafeArrayAccessData(pSafeArray, &pData)))
                    {
                        // here you can cast pData to an array (pointer) of the type you expect
                        // (The API you're using probably returns a safearray of VARIANTs,
                        // so I'll use VARIANT here. You should double-check this.)
                        VARIANT* pItems = (VARIANT*)pData;

                        // use the data here.

                        // end accessing data
                        SafeArrayUnaccessData(pSafeArray);
                    }
                }
            }
        }
    }
}

@HansPassant调用
VariantStringArray
VariantStringArrayAlloc
后,似乎需要进行清理,以释放分配的内存或解锁safearray。我在文件里什么都没看到。你知道这些方法在内存中做什么吗?@MichaelGunter-这个库基本上是针对PropVariant的,这些实用程序用于向量(VT|u VECTOR | VT|uxxx),而不是安全数组。您需要释放数组和从VariantToStringArrayAlloc返回的字符串,在调用VariantToStringArray和释放分配的字符串之前,您必须自己分配数组。@SimonMourier如何释放从VariantToStringArrayAlloc返回的内存<代码>CoTaskMemFree?仅对数组本身而不是单个字符串(即,是否与数组相邻分配了项)执行此操作就足够了吗?使用
VariantToStringArray
,是否只为数组分配内存,并让函数分配项?在这种情况下,你如何清理?如果没有,调用方分配内存的期望值是多少?还是我误解了这一切,字符串“array”实际上只是内存中背靠背的一团字符串?@HansPassant调用
VariantToStringArray
VariantToStringArrayAlloc
后,似乎需要进行清理,以释放分配的内存或解锁safearray。我在文件里什么都没看到。你知道这些方法在内存中做什么吗?@MichaelGunter-这个库基本上是针对PropVariant的,这些实用程序用于向量(VT|u VECTOR | VT|uxxx),而不是安全数组。您需要释放数组和从VariantToStringArrayAlloc返回的字符串,在调用VariantToStringArray和释放分配的字符串之前,您必须自己分配数组。@SimonMourier如何释放从VariantToStringArrayAlloc返回的内存<代码>CoTaskMemFree?仅对数组本身而不是单个字符串(即,是否与数组相邻分配了项)执行此操作就足够了吗?使用
VariantToStringArray
,是否只为数组分配内存,并让函数分配项?在这种情况下,你如何清理?如果没有,调用方分配内存的期望值是多少?还是我误解了这一切,字符串“array”实际上只是记忆中背靠背的一团字符串?非常感谢。你的回答非常有用。SAFFEARRAY的维度大于1。在我的示例中是65262如何获取此safearray的元素?@mahdiLotfi
SafeArrayGetDim
正在返回
65262
?这似乎极不可能。仔细检查您是否传入了正确的
LPSAFEARRAY
。非常感谢。您的回答非常有用。SAFFEARRAY的维度大于1。在我的示例中是65262如何获取此safearray的元素?@mahdiLotfi
SafeArrayGetDim
正在返回
65262
?这似乎极不可能。仔细检查是否传入了正确的
LPSAFEARRAY