6

在这里,我有一个带有 C++ WinRT 组件的 C# Metro 应用程序。我需要在 WinRT 中做一些事情,比如分配照片的名称/路径,并检索照片的缩略图。

首先,我在 WinRT C++ 中编写了一个值结构并检索结构数组函数,如下所示。

public value struct Item
{
    String^ strName;
    String^ strPath;
};
public ref class CTestWinRT sealed
{
public:
    CTestWinRT();
    void TestOutStructArray(Platform::WriteOnlyArray<Item>^ intOutArray)
    {
        intOutArray->Data[0].strName = ref new String(L"test1.jpg");
        intOutArray->Data[0].strPath = ref new String(L"c:\\temp");
        intOutArray->Data[1].strName = ref new String(L"test2.jpg");
        intOutArray->Data[1].strPath = ref new String(L"c:\\temp");
    }
};

然后我在 C# 按钮单击中使用 TestOutStructArray 函数,如下所示。

    CTestWinRT myNative = new CTestWinRT();
    private void btnTestClick(object sender, RoutedEventArgs e)
    {
        Item[] items = new Item[2];
        myNative.TestOutStructArray(items);
    }

该功能工作正常,项目数组可以通过调试窗口看到值是正确的。

现在,我想在值结构中添加一个字节数组,如下所示。

public value struct Item
{
    String^ strName;
    String^ strPath;
    uint8 byteThumbnail[8096];
};

这将导致以下编译器错误:

错误 C3987:“byteThumbnail”:公共成员的签名包含本机类型“无符号字符 [8096]”

错误 C3992:“byteThumbnail”:公共成员的签名包含无效类型“无符号字符 [8096]”

我查看了有关 value struct 的 MSDN,它说 value struct 不能有 ref 类或 struct 作为成员,所以我想我不能像上面那样编写代码。

http://msdn.microsoft.com/en-us/library/windows/apps/hh699861.aspx

有谁知道如何使用另一种方式来替换值结构?我需要数组里面有“字节数组”。

4

1 回答 1

5

可以跨 ABI 传递以下数组类型:

  1. 常量平台::数组^,
  2. 平台::数组^*,
  3. 平台::WriteOnlyArray,
  4. Platform::Array^ 的返回值。

结构或值类只能包含基本数字类型、枚举类或 Platform::String^ 作为字段。

因此,您不能将值结构与数组一起使用。而且你不能使用 uint8[] 类型的数组。

您应该单独或使用 ref 类传递数组和结构。

于 2013-01-29T17:02:42.960 回答