2012-09-18 5 views
10

C++ safearrayポインターへのポインターを反復してその要素にアクセスする方法。リム・バイオLiongによって投稿SAFEARRAY **を反復する方法

私は解決策を複製しようとした http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/022dba14-9abf-4872-9f43-f4fc05bd2602 が、奇妙なことには、IDLのメソッドのシグネチャは任意のアイデア

HRESULT __stdcall GetTestStructArray([out] SAFEARRAY ** test_struct_array); 

代わりの

HRESULT __stdcall GetTestStructArray([out] SAFEARRAY(TestStruct)* test_struct_array); 

ように出てくるということです?事前に

おかげ

+0

'cmd'は何ですか? ! –

答えて

21

たSafeArraysはSafeArrayCreateまたはSafeArrayCreateVectorで作成されていますが、SAFEARRAYを反復処理について尋ねると、あなたはすでにいくつかの他の関数によって返されたSAFEARRAYを持っているとしましょうされています。 1つの方法は、SafeArrayGetElement APIを使用することです。これは多次元SAFEARRAYがある場合に特に便利です。IMOでは、インデックスの指定が少し簡単です。

しかし、ベクトル(一次元のSAFEARRAY)では、データに直接アクセスして値を反復する方が高速です。ここでは例です:

だが、それはlong秒、すなわちのSAFEARRAYだとしましょう。 VT_I4

// get them from somewhere. (I will assume that this is done 
// in a way that you are now responsible to free the memory) 
SAFEARRAY* saValues = ... 
LONG* pVals; 
HRESULT hr = SafeArrayAccessData(saValues, (void**)&pVals); // direct access to SA memory 
if (SUCCEEDED(hr)) 
{ 
    long lowerBound, upperBound; // get array bounds 
    SafeArrayGetLBound(saValues, 1 , &lowerBound); 
    SafeArrayGetUBound(saValues, 1, &upperBound); 

    long cnt_elements = upperBound - lowerBound + 1; 
    for (int i = 0; i < cnt_elements; ++i) // iterate through returned values 
    {        
    LONG lVal = pVals[i]; 
    std::cout << "element " << i << ": value = " << lVal << std::endl; 
    }  
    SafeArrayUnaccessData(saValues); 
} 
SafeArrayDestroy(saValues); 
+5

SafeArrayDestroy()はこのコードに属していません。あなたがそれを所有していないなら、配列を破壊しないでください。 –

+0

'どこからでも取得する 'というのは、メソッドがSAFEARRAYを' [out] 'パラメータとして返すという典型的なシナリオを示すことを意図していましたが、クライアントがクリーンアップを担当していますが、回答を編集しました –

+0

2次元のときにSafearrayにアクセスするにはどうすればよいですか? – savi

3

MSDN SafeArrayGetElement functionはあなたの配列に個々のオブジェクトを取得するためにSafeArrayGetElementを使用して上のコードスニペットを提供します。

SAFEARRAY structureSafeArray*の機能が利用できるAPIについて説明します。

ATL/MFCプロジェクトでは、ラッパークラスを使用することをお勧めします。 CComSafeArrayを使用すると、作業が簡単になります。これについてはSimplifying SAFEARRAY programming with CComSafeArrayを参照してください。

+0

最後のリンクが壊れています。 –

+0

@SimonMourier:ありがとう、私はキャッシュされたリンクに置き換えられました。私はorignialのコンテンツが永久にまたは一時的に利用できないかどうかはわかりません。 –

+1

次の場合は見つかりました:https://blogs.msmvps.com/gdicanio/2011/02/04/simplifying-safearray-programming-with-ccomsafearray/ googleのヘルプ –