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

Chr*_*ris 11 c# c++ safearray visual-c++

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

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

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

任何帮助表示赞赏

Lit*_*ton 26

以下是在C++中创建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);
    }
}
Run Code Online (Sandbox Code Playgroud)

完成时释放指针,如下面的代码 -

  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
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*uan 8

继续@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;
    // ...
Run Code Online (Sandbox Code Playgroud)

至少,即使您不打算使用CComSafeArray它,也可以解构其源代码,<atlsafe.h>让您更好地了解SAFEARRAY函数的内容,时间,原因和方式.