11

C++ safearray ポインターからポインターへの反復処理を行い、その要素にアクセスする方法。

Lim Bio Liong 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);

何か案は?

前もって感謝します

4

2 に答える 2

24

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

ただし、ベクトル (一次元 SAFEARRAY) の場合は、データに直接アクセスして値を反復処理する方が高速です。次に例を示します。

longs の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);
于 2012-09-18T20:12:23.187 に答える
4

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

SAFEARRAY構造SafeArray*関数は、利用可能な API を説明しています。

ATL/MFC プロジェクトでは、ラッパー クラスを使用CComSafeArrayして、物事をよりシンプルかつ簡単にすることができます。これについては、CComSafeArray を使用した SAFEARRAY プログラミングの簡素化を参照してください。

于 2012-09-18T20:05:24.627 に答える