.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();
}
}