2013-11-26 58 views
2

我試圖從Visual C++中的SAFEARRAY(作爲函數的輸出返回)中獲取元素。從SAFEARRAY獲取元素(或將其轉換爲長陣列)

我從來沒有使用SAFEARRAY之前,所以我不知道如何處理它。我應該將SAFEARRAY轉換爲長陣列(如何?),還是我可以簡單地使用SAFEARRAY中的值的索引?

回答

3

您應該熟悉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); 
} 

注意,上面的代碼還沒有看到一個編譯器...

+0

好的!我將閱讀MSDN上的文檔。但是我真正需要的是SAFEARRAY的第二個元素,我不能用索引來調用它嗎?我必須迭代它嗎? – user3030211

+0

不,你不必迭代它,你需要了解安全數組的rgsabound []部分。而且,正如伊戈爾所說,你可能會負責銷燬傳遞給你的數組。如果您只需訪問第二個元素,則使用SafeArrayGetElement()。 –

+0

我想迭代整個數組以更好地理解SAFEARRAYs,使用下面的代碼;你能告訴我爲什麼它不起作用嗎? 'code: long lBound; long uBound; SafeArrayGetUBound(info,1,&uBound); SafeArrayGetLBound(info,1,&lBound); \t float item; 爲(長IND = LBOUND; IND user3030211

2

參見SafeArrayGetElementSafeArrayAccessData。前者逐個檢索元素。後者給你一個指向這個SAFEARRAY實例包裝的扁平C風格數組的指針(當你完成時,不要忘記SafeArrayUnaccesData)。

另請注意,一旦不再需要,您很可能會負責銷燬陣列(使用SafeArrayDestroy)。

+0

非常感謝。我剛剛看到這些功能,但我無法弄清楚這個問題;你能讓我(或鏈接我)的兩個功能的例子嗎? – user3030211