C++ 如何访问C+;中COM对象返回的变量数据类型中的安全数组+;?
我正在使用COM对象。我调用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
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的元素?@mahdiLotfiSafeArrayGetDim
正在返回65262
?这似乎极不可能。仔细检查您是否传入了正确的LPSAFEARRAY
。非常感谢。您的回答非常有用。SAFFEARRAY的维度大于1。在我的示例中是65262如何获取此safearray的元素?@mahdiLotfiSafeArrayGetDim
正在返回65262
?这似乎极不可能。仔细检查是否传入了正确的LPSAFEARRAY
。