6

ここに、C++ WinRT コンポーネントを含む C# メトロ アプリがあります。写真の名前/パスを割り当てたり、写真のサムネイルを取得したりするなど、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': パブリック メンバーの署名にネイティブ型 'unsigned char [8096]' が含まれています

エラー C3992: 'byteThumbnail': パブリック メンバーの署名に無効な型 'unsigned char [8096]' が含まれています

値構造体についてMSDNで調べたところ、値構造体はrefクラスや構造体をメンバに持つことはできないとのことで、上記のようなコードは書けないと思います。

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

値構造体を置き換える別の方法を使用する方法を知っている人はいますか? 内部に「バイト配列」を含めるには、配列が必要です。

4

1 に答える 1

5

次の配列型は、ABI で渡すことができます。

  1. const プラットフォーム::配列^,
  2. プラットフォーム::配列^*,
  3. プラットフォーム::WriteOnlyArray、
  4. Platform::Array^ の戻り値。

値構造体または値クラスには、基本的な数値型、列挙型クラス、または Platform::String^ のみをフィールドとして含めることができます。

したがって、配列で値構造体を使用することはできません。また、uint8[] 型の配列は使用できません。

配列と構造体は別々に渡すか、ref クラスを使用して渡す必要があります。

于 2013-01-29T17:02:42.960 に答える