2009-08-24 3 views
0

У меня возникли проблемы с установкой способа представления структуры, содержащей указатель на массив шорт в моем управляемом коде. Структура выглядит следующим образом:Маршалинг указателя на массив типов (управляемый C# -> неуправляемый C++)

typedef struct 
{ 
    short size; 
    unsigned short** shortValues; 
} UnmanagedStruct; 

память «shortValues» выделяется внутри неуправляемого кода - поэтому даже если это поле просто указатель на массив коротких значений, дополнительный уровень косвенности был добавлен, так что выделенная память также просматривается вызывающим (управляемым кодом). Поле 'size' представляет количество элементов в массиве. Как я могу представить это в управляемом коде?

Я думал, что передал бы его всего лишь , тогда я не мог понять, как получить доступ к значениям после возврата неуправляемого вызова.

ответ

0

Небезопасный код в порядке?

public unsafe struct UnmanagedStruct 
{ 
    public short size; 
    public ushort** shortValues; 
} 

[DllImport("example.dll")] 
public static extern void GetUnmanagedStruct(out UnmanagedStruct s); 

Если у вас есть указатель на массив ushort с:

public static unsafe void WriteValues() 
{ 
    UnmanagedStruct s; 
    GetUnmanagedStruct(out s); 
    for (var i = 0; i < s.size; i++) 
    { 
     ushort x = (*s.shortValues)[i]; 
     Console.WriteLine(x); 
    } 
} 

Если у вас есть массив с завершающим нулевым массивов ushort с:

public static unsafe void WriteValues() 
{ 
    UnmanagedStruct s; 
    GetUnmanagedStruct(out s); 
    for (var i = 0; i < s.size; i++) 
    { 
     for (ushort* p = s.shortValues[i]; p != null; p++) 
     { 
      ushort x = *p; 
      Console.WriteLine(x); 
     } 
    } 
} 
+0

Этот код выглядит точно для меня. Спасибо dtb! Пока я обращаю ваше внимание, могу ли я задать еще один вопрос? Я разместил его в другом потоке: http://stackoverflow.com/questions/1323797/marshaling-pointer-to-an-array-of-strings – Dilip

+0

BTW: лучше обновить свой вопрос, чем опубликовать ответ на свой вопрос. вопрос с новыми деталями. Кроме того, если ответ решает вашу проблему, не забудьте принять его! :) – dtb

+0

@dtb: Я должен быть слепым здесь, но как я могу «принять» ответ? – Dilip

0

К сожалению, ребята. Я неправильно понял проблему. Он выглядит так:

неподготовленный короткий ** короткийValues;

- указатель на массив указателей на шорты. Таким образом, каждый элемент сам по себе короткий *

Единственный способ, которым я могу думать делать это:

общественного класса UnmanagedStruct { общественного ИНТ размер; public IntPtr shortValues; }

После возврата вызова из неуправляемого кода:

IntPtr [] listOfShorts = новый IntPtr [размер]; Marshal.Copy (shortValues, listOfShorts, 0, размер);

Каждый IntPtr в спискеOfShorts теперь указывает на короткий []. Но теперь проблема в том, что я не знаю размер каждого отдельного массива, что означает, что я не могу их извлечь.

Я должен где-то пропускать какую-то ключевую информацию.

 Смежные вопросы

  • Нет связанных вопросов^_^