我試圖從Visual C++中的SAFEARRAY(作爲函數的輸出返回)中獲取元素。從SAFEARRAY獲取元素(或將其轉換爲長陣列)
我從來沒有使用SAFEARRAY之前,所以我不知道如何處理它。我應該將SAFEARRAY轉換爲長陣列(如何?),還是我可以簡單地使用SAFEARRAY中的值的索引?
我試圖從Visual C++中的SAFEARRAY(作爲函數的輸出返回)中獲取元素。從SAFEARRAY獲取元素(或將其轉換爲長陣列)
我從來沒有使用SAFEARRAY之前,所以我不知道如何處理它。我應該將SAFEARRAY轉換爲長陣列(如何?),還是我可以簡單地使用SAFEARRAY中的值的索引?
您應該熟悉MSDN上的SafeArray文檔。
你可能想要做的就是調用SafeArrayAccessData()
來獲得一個指向安全數組內存緩衝區的指針,然後直接迭代這些值。這可能是訪問這些值最有效的方式。下面的代碼假定了很多,你應該確保你瞭解這些假設(通過讀取安全數組文檔),他們持有特定的情形......
void Func(SAFEARRAY *pData)
{
void *pVoid = 0;
HRESULT hr = ::SafeArrayAccessData(pData, &pVoid);
MyErrorCheck::ThrowOnFailure(hr);
const long *pLongs = reinterpret_cast<long *>(pVoid);
for (int i = 0; i < pData->rgsabound[0].cElements; ++i)
{
const long val = pLongs[i];
DoThingWithLong(val);
}
hr = ::SafeArrayUnaccessData(pData);
MyErrorCheck::ThrowOnFailure(hr);
}
注意,上面的代碼還沒有看到一個編譯器...
參見SafeArrayGetElement
或SafeArrayAccessData
。前者逐個檢索元素。後者給你一個指向這個SAFEARRAY
實例包裝的扁平C風格數組的指針(當你完成時,不要忘記SafeArrayUnaccesData
)。
另請注意,一旦不再需要,您很可能會負責銷燬陣列(使用SafeArrayDestroy
)。
非常感謝。我剛剛看到這些功能,但我無法弄清楚這個問題;你能讓我(或鏈接我)的兩個功能的例子嗎? – user3030211
好的!我將閱讀MSDN上的文檔。但是我真正需要的是SAFEARRAY的第二個元素,我不能用索引來調用它嗎?我必須迭代它嗎? – user3030211
不,你不必迭代它,你需要了解安全數組的rgsabound []部分。而且,正如伊戈爾所說,你可能會負責銷燬傳遞給你的數組。如果您只需訪問第二個元素,則使用SafeArrayGetElement()。 –
我想迭代整個數組以更好地理解SAFEARRAYs,使用下面的代碼;你能告訴我爲什麼它不起作用嗎? 'code: long lBound; long uBound; SafeArrayGetUBound(info,1,&uBound); SafeArrayGetLBound(info,1,&lBound); \t float item; 爲(長IND = LBOUND; IND
user3030211