SAFEARRAY
12896 ワード
SAFEARRAYとは?次元数、長さ、境界、要素タイプなどの情報を定義できる配列と理解でき、差はC#のリストに相当しない.
普通はいつ使いますか.COMコンポーネントを作成する場合、一度に多くのデータを渡す必要がある場合、SAFEARRAYを使うと便利です.VBとCの間、またはVBとVC++の間で配列または文字列を渡し、C、C++またはATLでDLLを作成するときにSAFEARRAYを使用します.
どう使いますか
タイプ付録
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++コードを呼び出すには、これを使って、何かを伝える必要があります.しかし、多次元についてはあまり詳しくありません.特に下付きの処理です.
参考1参考2参考3
普通はいつ使いますか.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