c# - 如何在 C++ 中创建和初始化 double 的 SAFEARRAY 以传递给 C#

标签 c# c++ visual-c++ safearray

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

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

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

感谢任何帮助

最佳答案

以下是在 C++ 中创建安全数组的代码。

#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

如果您将 ATL 用于 C++,则最好使用在“atlsafe.h”中声明的 CComSafeArray。这是 SAFEARRAY 的包装器。 link text

关于c# - 如何在 C++ 中创建和初始化 double 的 SAFEARRAY 以传递给 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3730840/

相关文章:

C++ 检查未初始化的迭代器

c++ - 没有 OpenGL 的纹理映射

c++ - 上下文 "use_current"的任务继续不起作用

c# - 从电源查询设置时如何从 header 中删除 MaxDataServiceVersion : 3. 0

c# - EF Core 条件(添加)包含到 IQueryable

c# - 在 C# 中打印源文件名和行号

c++ - 在 VC++14 中使用 std::basic_stringstream<char16_t> 时出错

c# - 是否有一个属性可以避免 MSTest 中的级联单元测试失败?

c++ - 即使在使用守卫后也不能使用在另一个类中定义的结构

c++ - 当我尝试在 main 中调用插入函数时,它没有取数字?