我的C#方法需要从C++中调用
最初,我的C#方法需要一个double[]类型的参数,但是在从C++调用时,它变成了一个SAFEARRAY。
在C++中,我需要从一个double数组中获取数据,并填充一个SAFEARRAY。我还没有找到任何可用的示例代码。
非常感谢您的帮助。
我的C#方法需要从C++中调用
最初,我的C#方法需要一个double[]类型的参数,但是在从C++调用时,它变成了一个SAFEARRAY。
在C++中,我需要从一个double数组中获取数据,并填充一个SAFEARRAY。我还没有找到任何可用的示例代码。
非常感谢您的帮助。
#include<oaidl.h>
void CreateSafeArray(SAFEARRAY** saData)
{
double data[10]; // some sample data to write into the created safearray
SAFEARRAYBOUND Bound;
Bound.lLbound = 0;
Bound.cElements = 10;
*saData = SafeArrayCreate(VT_R8, 1, &Bound);
double HUGEP *pdFreq;
HRESULT hr = SafeArrayAccessData(*saData, (void HUGEP* FAR*)&pdFreq);
if (SUCCEEDED(hr))
{
// copy sample values from data[] to this safearray
for (DWORD i = 0; i < 10; i++)
{
*pdFreq++ = data[i];
}
SafeArrayUnaccessData(*saData);
}
}
SAFEARRAY* saData;
CreateSafeArray(&saData); // Create the safe array
// use the safearray
...
...
// Call the SafeArrayDestroy to destroy the safearray
SafeArrayDestroy(saData);
saData = NULL; // set the pointer to NULL
继续 @Liton 的回答,我想强调他的最后一句话,即 ATL 的 CComSafeArray
。它真的可以节省你很多打字时间。 CComSafeArray
具有 C++ 构造函数、析构函数、运算符重载,包括一个用于 [ ] 的运算符重载,它给你一个读/写引用来访问 SAFEARRAY
中的任何元素。简而言之,你真的可以专注于你的业务逻辑,不必担心 SAFEARRAY
的实现细节:
#include <atlbase.h>
#include <atlsafe.h>
// ...
CComSafeArray<double> arr(10);
arr[0] = 2.0;
arr[1] = 3.0;
arr[2] = 5.0;
// ...
至少,即使您不打算使用CComSafeArray
,也值得拆解其源代码中的<atlsafe.h>
,以便更好地了解SAFEARRAY
函数的何时、为什么和如何使用。
不建议传递SAFEARRAYs。建议将SAFEARRAY放入VARIANT中。此外,SAFEARRAY应持有VARIANT数据。这样可以使传递包含VARIANT的SAFEARRAY到其他语言更加有用。例如,C++到VB / C#(注意,释放/销毁SAFEARRAY由调用方负责)
在之前的代码基础上构建
// A VARIANT holding a SAFEARRAY of VARIANTs
VARIANT vRet;
SAFEARRAYBOUND Bound;
Bound.lLbound = 0;
Bound.cElements = 10;
SAFEARRAY * psaData = SafeArrayCreate(VT_VARIANT, 1, &Bound);
VARIANT HUGEP * pData = NULL;
HRESULT hr = SafeArrayAccessData(psaData, (void HUGEP * FAR *)&pData);
if (SUCCEEDED(hr))
{
for (short i = 0; i < 10; ++i,++pData)
{
::VariantInit(pData);
pData->vt = VT_I2;
pData->iVal = i;
}
SafeArrayUnaccessData(psaData);
}
vRet.vt = VT_ARRAY | VT_VARIANT;
vRet.parray = psaData;