【问题标题】:Platform::Array<byte>^ to char* - conversion and memoryPlatform::Array<byte>^ 到 char* - 转换和内存
【发布时间】:2015-04-03 21:19:24
【问题描述】:

我有一个要在我的 Windows 应用商店 C# 应用程序中使用的 C 代码。不是很擅长 C/C++ 但可以在几行内猛击,所以我有一个问题和一个问题。其中一个 C 源函数如下所示:

send_data(const char *data, size_t len)

我尝试编写的 C++/CX 包装类中此 send_data C 方法的包装方法具有以下签名:

WrapperClass::send_data(const Platform::Array<byte>^ buff)

问题来了:

  1. 如何将 Platform::Array^ 转换为 char* 以便调用 send_data?是否需要分配内存并添加 NULL 来终止 char* 数组?
  2. 当我将 C# 中的数据作为 byte[] 传递时,是否需要将其固定在内存中,以免它被移动?

【问题讨论】:

  • 这看起来不像 c 或 c++。这可能实际上是 c++/cli 吗?
  • 源代码在 C 中,我尝试获取 C++CLI 部分。为了清楚起见,编辑了问题
  • @Angew & Kamen 啊,我的错。
  • Platform::Array 是原生类型,语言扩展名为 C++/CX。与托管代码无关,无需固定。您只需使用 new 运算符创建一个 char* 缓冲区并复制字节。不要忘记 0 终止符,只需始终附加它以确保。

标签: arrays interop c++-cx


【解决方案1】:

我是否需要 [...] 添加 NULL 来终止 char* 数组?

这取决于 C send_data() 函数实际发送的内容。它会发送0-terminator 吗?如果“是”,那么您要么需要提供它,要么让您的发件人的实现附加它。

【讨论】:

    【解决方案2】:

    所以,回答我的第一个问题 - 将 Platform::Array 转换为 char* 并不难:

    const char* data = _strdup((const char*)data->Data);
    

    注意,我使用的是 Visual C++ CLI (Visual Studio 2013),所以 _strdup 是那里的选择。

    至于固定 - 稍后会看到:)

    【讨论】:

    • 这不是 CLI,它是 C++/CX,它与 C++/CLI 在语法上有很多相似之处。正如 Hans 上面所说,由于没有垃圾收集,因此无需在 C++/CX 中固定任何内容。
    猜你喜欢
    • 2013-01-17
    • 2020-04-27
    • 2014-07-21
    • 2019-04-04
    • 2013-06-26
    • 2014-12-11
    • 1970-01-01
    • 2023-01-21
    • 2011-07-22
    相关资源
    最近更新 更多