.NET 2.x C# Подскажите как правильно передать указатель на структуру в функцию

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, возникли проблемы с переходом из С в С#, к сожалению синтаксис C# знаю плохо и сразу возник вопрос: Есть функция из импортируемой библиотеки lib1.dll, на С, описанная в её .h файле как:
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;
Я её пытаюсь подключить на C# следующим образом:
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);
       ...
Структура передаётся функции неправильно. Остальное вроде нормально, про Am - не уверен. Подскажите как правильно объявить указатель на структуру, а затем непосредственно как это записать при вызове функции и передаче параметров? Вобщем, надо вызвать в программе эту функцию, кому не сложно - напишите пример

Решение задачи: «.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();
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5
Похожие ответы