Запись значения с плавающей запятой в неуправляемую память? - PullRequest
2 голосов
/ 09 октября 2009

Я создаю клиент .NET и ссылаюсь на RCW , предоставленный OPC Foundation .

Одна из функций имеет этот параметр:

[IN] IntPtr pPercentDeadBand

В документации упоминается, что я должен передать указатель на значение с плавающей точкой.

Здесь я борюсь. Я нашел Marshall..WriteByte, .WriteInt16 и .Writeint32.

Но нечего записать значение с плавающей запятой из управляемой памяти в неуправляемую память.

Ответы [ 3 ]

1 голос
/ 09 октября 2009

Вместо этого вы можете использовать Marshal.Copy и передавать плавающее [] с одним элементом.

Или вы можете вставить биты из числа с плавающей точкой в ​​int и использовать Marshal.WriteInt32. Эта объединяющая структура может использоваться для преобразования между двумя

[StructLayout(LayoutKind.Explicit)]
struct SingleInt32Union
{
    [FieldOffset(0)]
    float s;
    [FieldOffset(0)]
    int i;
}
1 голос
/ 09 октября 2009

Я бы сделал это одним из следующих способов, упорядочив от лучшего к худшему:

  1. Измените определение сборки взаимодействия этого метода. Если это указатель на число с плавающей точкой, его следует объявить следующим образом.

    ref float pPercentDeadBand
    

    не

    [In] IntPtr pPercentDeadBand
    
  2. Используйте небезопасный код для передачи указателя на число с плавающей точкой:

    unsafe
    {
        float theValueToPass = 345.26f;
        IntPtr thePointer = new IntPtr(&theValueToPass);
        //pass thePointer to the method;
    }
    
  3. Выделите 4 байта памяти, используя Marshal.AllocHGlobal, скопируйте значение с плавающей точкой из массива float из одного элемента, используя Marshal.Copy, вызовите метод, используя указатель, полученный от Marshal.AllocHGlobal, а затем освободите память с помощью Marshal. FreeHGlobal.

0 голосов
/ 09 октября 2009

Если это OPC Foundation, похоже, что они имеют API управляемого кода . UA SDK 1.00 включает поддержку сред разработки .NET, согласно opcconnect.com .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...