如何在C ++中创建和初始化双精度SAFEARRAY以传递给C#

我需要从C ++调用我的C#方法

最初我的C#方法接受double []类型的参数,但是当从C ++调用时它变成了SAFEARRAY

在C ++中,我需要从双精度数组中获取数据,并填充SAFEARRAY。 我没有找到任何示例代码来执行此操作。

任何帮助表示赞赏

以下是在C ++中创建safearray的代码。

#include 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 

如果你使用ATL for C ++,那么最好使用在“atlsafe.h”中声明的CComSafeArray。 这是SAFEARRAY的包装。 链接文字

继续@Liton的回答,我想强调他的最后一句话,即ATL的CComSafeArray 。 它真的可以为你节省很多打字。 CComSafeArray具有C ++构造函数,析构函数,运算符重载,包括[]的一个,它为您提供对SAFEARRAY任何元素的读/写引用。 简而言之,您可以真正专注于您的业务逻辑,而无需担心SAFEARRAY管道:

 #include  #include  // ... CComSafeArray arr(10); arr[0] = 2.0; arr[1] = 3.0; arr[2] = 5.0; // ... 

至少,即使您不打算使用CComSafeArray也值得在解构其源代码,让您更好地了解SAFEARRAY函数的内容,时间,原因和方式。

不建议通过SAFEARRAY。 建议将SAFEARRAY放入VARIANT。 此外,SAFEARRAY应该保存VARIANT数据。 这提供了所有世界中最好的,并使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;