.NET 2.x C# Подскажите как правильно передать указатель на структуру в функцию
Формулировка задачи:
Здравствуйте, возникли проблемы с переходом из С в С#, к сожалению синтаксис C# знаю плохо и сразу возник вопрос:
Есть функция из импортируемой библиотеки lib1.dll, на С, описанная в её .h файле как:
Я её пытаюсь подключить на C# следующим образом:
И использовать в программе (текста много, привожу отрывками):
Структура передаётся функции неправильно. Остальное вроде нормально, про Am - не уверен.
Подскажите как правильно объявить указатель на структуру, а затем непосредственно как это записать при вызове функции и передаче параметров?
Вобщем, надо вызвать в программе эту функцию, кому не сложно - напишите пример
DWORD St(PSParams ps_params, BYTE Pr, char* Am, WORD TTO, WORD HTO); //где PSParams - указатель на структуру SParams. ypedef struct tagSParams { BYTE x1; DWORD x2; DWORD x3; BYTE x4; BYTE x5; BYTE x6; } sParams;
public class Lib1 { const string _dllLocation = "lib1.dll"; [DllImport(_dllLocation, EntryPoint = "St", CallingConvention = CallingConvention.Cdecl)] public unsafe static extern UInt32 St(IntPtr PSParams, byte Pr, byte* Am, UInt16 TTO, UInt16 HTO); ...
[StructLayout(LayoutKind.Sequential, Pack = 1)] public unsafe struct SParams { public byte x1; public ushort x2; public ushort x3; public byte x4; public byte x5; public byte x6; } ... SParams s_params; s_params.x1=1; s_params.x2=300; ... s_params.x6=1; ... uint resSt; int size = Marshal.SizeOf(typeof(SParams)); IntPtr PSParams = Marshal.AllocHGlobal(size); byte[] Am = Encoding.UTF8.GetBytes("000000000001"); unsafe { fixed (byte* pAm = Am) resSt = Lib1.St(PSParams, Pr, pAm, TTO, HTO); ...
Решение задачи: «.NET 2.x C# Подскажите как правильно передать указатель на структуру в функцию»
textual
Листинг программы
class Program { [DllImport( "ntdll.dll", SetLastError = true )] unsafe static extern uint NtQuerySystemInformation ( uint SystemInformationClass, SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION* SystemInformation, int SystemInformationLength, int* ReturnLength ); struct SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION { public long IdleTime; public long KernelTime; public long UserTime; public long Reserved0; public long Reserved1; public uint Reserved2; } unsafe static void Main ( string[] args ) { var sppi = new SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION(); var dwSize = Marshal.SizeOf( sppi ); NtQuerySystemInformation( 3U, &sppi, dwSize, &dwSize ); Debugger.Break(); Console.ReadKey(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д