SAFEARRAY

12896 ワード

SAFEARRAYとは?次元数、長さ、境界、要素タイプなどの情報を定義できる配列と理解でき、差はC#のリストに相当しない.
普通はいつ使いますか.COMコンポーネントを作成する場合、一度に多くのデータを渡す必要がある場合、SAFEARRAYを使うと便利です.VBとCの間、またはVBとVC++の間で配列または文字列を渡し、C、C++またはATLでDLLを作成するときにSAFEARRAYを使用します.
どう使いますか
#include //       
//**************//
SAFEARRAY * pSA;
SAFEARRAYBOUND arrbound[1];//    
int arrsize = 50;
arrbound[0].lLbound = 0;//          
arrbound[1].cElements = (long)arrsize; //     

//     double   。.        。
pSA = SafeArrayCreate(VT_R8, 1, arrbound);//  VT_R8  double  (       ),           
for (long i=0;i<4;i++)
{
    Safe
}


//       
HRESULT

タイプ付録
byte VT_UI 1非負バイトShort VT_I 2符号付き16ビット短縮型Long VT_I 4符号32ビット長整数型float VT_R 4 IEEE 4バイト実数double VT_R 8 IEEE 8バイト実数VARIANT_BOOL VT_BOOL 16ビットブール0=false,0 xFFFFFF=true SCODE VT_ERROR 16転位誤符号CY VT_CY 16ビット通貨構造DATE VT_DATEは、二重精度数字で表される日付BSTR VT_を用いるBSTR visual basicスタイルの文字構造DECIMAL VT_DECIMALの10進数構造IUnknown VT_UNKNOWN COMインタフェースのポインタIDispatch VT_DISPATCH COM DispatchインタフェースのポインタSAFEARRAY*VT_ARRAY配列データを転送するための特別な構造VARIANT*VT_VARIANT 1つのVARIANT構造のポインタvoid*普通のポインタVT_BYREF任意のタイプ(ポインタ以外)のポインタ
私もdemoを書きました.多くの状況を含めた.一般的にC#でC++コードを呼び出すには、これを使って、何かを伝える必要があります.しかし、多次元についてはあまり詳しくありません.特に下付きの処理です.
// CPlus1.cpp :       "main"   。             。
//

#include "pch.h"
#include 
#include 
#include  
using std::cout;
using std::endl;
using std::cerr;
int main()
{
#pragma region wax
    std::cout << "Hello World!
"
; SAFEARRAY * pSA=NULL; SAFEARRAYBOUND arrbound[1]; // int arrsize = 3; arrbound[0].lLbound = 0; // arrbound[0].cElements = (long)arrsize; // // double 。. 。 pSA = SafeArrayCreate(VT_R8, 1, arrbound);// , , _variant_t vValue[3]; vValue[0] =long(4); vValue[1] =long(6); vValue[2] = long(7); for (long index = 0; index < 3; index++) { if (FAILED(SafeArrayPutElement(pSA, &index, &vValue[index])))// SAFEARRAY ; longx , SAFEARRAY , SAFEARRAY , 。 { MessageBox(NULL, L" ", L" ", MB_OK | MB_ICONWARNING); } // , :: } //VARIANT vsaValue; //vsaValue.vt = VT_ARRAY | VT_R8; //V_ARRAY(&vsaValue) = pSA; // vsaValue.parray = pSA; // ////// SafeArray ////BYTE buf[3]; // , 。 ////for (long index = 0; index < 3; index++) ////{ //// ::SafeArrayGetElement(vsaValue.parray,&index,buf+index); ////} ////// SafeArrayAccessData //// ////void HUGEP** ppvData; ////SafeArrayAccessData(pSA, ppvData); //// : ////double * pData= NULL; // //BYTE buf[3]; //long *LBoud=NULL; //long *UBoud=NULL; //SafeArrayAccessData(pSA, (void HUGEP **)&buf); //SafeArrayGetLBound(pSA, 1, LBoud);// , , 。 //SafeArrayGetUBound(pSA, 1, UBoud);// // ////::Write(buf, 3); ////double item = pData[3 - *LBoud]; // // //::SafeArrayUnaccessData(pSA); // SafeArrayDestroy(pSA); //************************************ **************************// //// , , , 。 long l2Arr[4][3] = { {3,15,9},{27,14,98},{35,11,6},{19,4,61} }; /* : 1#: l2Arr 2#: */ SAFEARRAY* lpSafeArr = NULL; // 。 HRESULT hr = SafeArrayAllocDescriptor(2, &lpSafeArr); // , 2 if (SUCCEEDED(hr)) { lpSafeArr->cDims=2; // lpSafeArr->cbElements = sizeof(l2Arr[0][0]); // ( ) lpSafeArr->fFeatures = FADF_AUTO | FADF_FIXEDSIZE; // ( ) lpSafeArr->pvData=l2Arr; // lpSafeArr->rgsabound[0].lLbound = 0; // 0 lpSafeArr->rgsabound[0].cElements = 4; // 4 (4 ) lpSafeArr->rgsabound[1].lLbound = 0; // 0 lpSafeArr->rgsabound[1].cElements = 3; // 3 (3 ) hr = SafeArrayAllocData(lpSafeArr); if (SUCCEEDED(hr)) { long rgIndices[2] = { 0,0 }; unsigned long nRowCount = lpSafeArr->rgsabound[0].cElements; unsigned long nColCount = lpSafeArr->rgsabound[1].cElements; long lLBound1, lLBound2, lUBound1, lUBound2; SafeArrayGetLBound(lpSafeArr, 1, &lLBound1);//0 SafeArrayGetUBound(lpSafeArr, 1, &lUBound1);//2 SafeArrayGetLBound(lpSafeArr, 2, &lLBound2);//0 SafeArrayGetUBound(lpSafeArr, 2, &lUBound2);//3 //1# l2Arr for (long i = lLBound2; i <= lUBound2; i++) { rgIndices[1] = i;// for (long j = lLBound1; j <= lUBound1; j++) { rgIndices[0] = j;// hr = SafeArrayPutElement(lpSafeArr, rgIndices, &(l2Arr[i][j])); if (FAILED(hr)) { cerr << "SafeArrayPutElement Failure.
"
; return -1; } } } //2# for (long i = lLBound2; i <= lUBound2; i++) { rgIndices[1] = i;// for (long j = lLBound1; j <= lUBound1; j++) { rgIndices[0] = j;// long lEleVal; hr = SafeArrayGetElement(lpSafeArr, rgIndices, &lEleVal); if (SUCCEEDED(hr)) { cout << lEleVal; ((j + 1) % (lUBound1 + 1) == 0) ? cout << endl : cout << "\t"; } } } SafeArrayDestroyData(lpSafeArr); } SafeArrayDestroyDescriptor(lpSafeArr); } }

参考1参考2参考3