У меня есть 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
Как правильно передать указатель структуры данных от C ++ к C# ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1751576313
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, но клещи и системное время имеют значения в них. Я был бы признателен за любую помощь в том, чтобы найти, почему это не работает.>
Подробнее здесь: [url]https://stackoverflow.com/questions/79689120/how-to-properly-pass-a-data-structure-pointer-from-c-to-c-sharp[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия