Как правильно передать указатель структуры данных от C ++ к C#C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как правильно передать указатель структуры данных от C ++ к C#

Сообщение Anonymous »

У меня есть C ++ DLL, который собирает данные из нашего оборудования. Я пытаюсь получить указатель на эти данные от C ++ DLL в C#. Вот структура данных C ++ < /p>
#pragma pack (push, 1)
typedef struct od
{
unsigned short Reserved1;
unsigned char Reserved2;

od()
: Reserved1(0)
, Reserved2(0)
{}
} OD;

typedef struct PortValue
{
USHORT pIndex;
USHORT value;
ULONG32 ticks;

PortValue()
: pIndex(0)
, value(0)
, ticks(0)
{}
} PORT_VALUE, *PPORT_VALUE;

typedef struct _Data
{
unsigned long Ticks;
unsigned long SystemTime;
unsigned short DisableNotification;
unsigned short Reserved2;
unsigned short NextValue;
unsigned short Reserved3;
PORT_VALUE PortValues[500];
OD Reserved4;

_Data()
: Ticks(0)
, SystemTime(0)
, DisableNotification(0)
, Reserved2(0)
, NextValue(0)
, Reserved3(0)
{}
} DATA, *PDATA;
#pragma pack (pop)
< /code>
Многое из этого является устаревшим кодом, и я не могу его изменить, иначе он сломает некоторые из наших старых программ.[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct OD
{
public ushort Reserved1 = 0;
public byte Reserved2 = 0;

public OD() {} // The compiler insists that this empty constructor is needed
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct PORT_VALUE
{
public ushort pIndex = 0;
public ushort value = 0;
public uint ticks = 0;

public PORT_VALUE() {}
}

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DATA
{
public uint Ticks = 0;
public uint SystemTime = 0;
public ushort DisableNotification = 0;
public ushort Reserved2 = 0;
public ushort NextValue = 0;
public ushort Reserved3 = 0;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 500)]
public PORT_VALUE[] PortValues = new PORT_VALUE[500];
public OD Reserved4 = new OD();

public DATA() {}
}
< /code>
Я сделал все возможное, но если вы видите какие -либо ошибки в вышеизложенном, пожалуйста, дайте мне знать.bool GetDataPtr(OUT PDATA *pData);
< /code>
и мой эквивалент C# < /p>
[DllImport("API.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I1)]
unsafe internal static extern bool GetDataPtr(ref DATA pData);
< /code>
Я действительно не уверен, если мне нужно ключевое слово «небезопасно», я попробовал его с и без него и получаю те же результаты.DATA pData = new DATA();
unsafe
{
GetDataPtr(ref pData);
}
< /code>
Когда функция возвращает все, все должно быть инициализировано до 0, но клещи и системное время имеют значения в них. Я был бы признателен за любую помощь в том, чтобы найти, почему это не работает.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... to-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»