如何将结构引用传递给DLL [英] How to pass reference of structure to DLL

查看:73
本文介绍了如何将结构引用传递给DLL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是我的结构:

  public   struct  _LineMove_TypeDef 
{
public int _mIpn;
public int _ObjAcc;
public int _ObjDec;
public int _ObjSpeed;

public int [] _AxisDist;
public int [] _axisPos;
}





这是我的DllImport:

 [ DllImport(DriveLibrary.dll,CallingConvention = CallingConvention.Cdecl,EntryPoint = _GoToPosInLine)] 
public static extern bool _GoToPosInLine( ref LineMoveStruct。 _LineMove_TypeDef _lm, bool dr = true bool p = false bool sync = false bool IntPol = false );


public bool GoToPosInLine( ref LineMoveStruct._LineMove_TypeDef _lm, bool dr = true bool p = false bool sync = false bool IntPol = false
{
return _GoToPosInLine( ref _lm,dr,p,sync,IntPol);
}





我的尝试:



  public  LineMoveStruct._LineMove_TypeDef _lmp; 
int pos = 200 ;
_lmp = new LineMoveStruct._LineMove_TypeDef();

_lmp._axisPos = new int [ 8 ];
_lmp._AxisDist = new int [ 8 ];
_lmp._axisPos [ 0 ] = pos * 2;
_lmp._axisPos [ 1 ] = _lmp._axisPos [ 0 ];
_lmp._axisPos [ 2 ] = _lmp._axisPos [ 1 ];
_lmp._AxisDist [ 0 ] = 30 ;
_lmp._AxisDist [ 1 ] = 30 ;
_lmp._AxisDist [ 2 ] = 30 ;
_lmp._mIpn = 1 ;
_lmp._ObjAcc = 10 ;
_lmp._ObjDec = 20 ;
_lmp._ObjSpeed = 2000 ;

IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(_lmp));

Marshal.StructureToPtr(_lmp,pnt, false );

LineMoveStruct._LineMove_TypeDef _lmp1;

_lmp1 =(LineMoveStruct._LineMove_TypeDef)Marshal.PtrToStructure(pnt, typeof (LineMoveStruct._LineMove_TypeDef));

Marshal.FreeHGlobal(pnt);


Motor._Mo.GoToPosInLine( ref _lmp);

解决方案

请参阅传递结构 [ ^ ]

Here is My structure:

public struct _LineMove_TypeDef
{
    public  int _mIpn;
    public  int _ObjAcc;
    public  int _ObjDec;
    public  int _ObjSpeed;
     
    public  int[] _AxisDist;
    public  int[] _axisPos;
}



Here is my DllImport:

[DllImport(DriveLibrary.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = _GoToPosInLine)]
public static extern bool _GoToPosInLine(ref LineMoveStruct._LineMove_TypeDef _lm, bool dr = true, bool p = false, bool sync = false, bool IntPol = false);


public bool GoToPosInLine(ref LineMoveStruct._LineMove_TypeDef _lm, bool dr = true, bool p = false, bool sync = false, bool IntPol = false)
{
    return _GoToPosInLine(ref _lm, dr, p, sync, IntPol);
}



What I have tried:

public LineMoveStruct._LineMove_TypeDef _lmp;
int pos = 200;
_lmp = new LineMoveStruct._LineMove_TypeDef();

_lmp._axisPos = new int[8];
_lmp._AxisDist = new int[8];
_lmp._axisPos[0] = pos*2;
_lmp._axisPos[1] = _lmp._axisPos[0];
_lmp._axisPos[2] = _lmp._axisPos[1];
_lmp._AxisDist[0] = 30;
_lmp._AxisDist[1] = 30;
_lmp._AxisDist[2] = 30;
_lmp._mIpn = 1;
_lmp._ObjAcc = 10;
_lmp._ObjDec = 20;
_lmp._ObjSpeed =2000;

IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(_lmp));

Marshal.StructureToPtr(_lmp, pnt, false);

LineMoveStruct._LineMove_TypeDef _lmp1;

_lmp1 = (LineMoveStruct._LineMove_TypeDef)Marshal.PtrToStructure(pnt, typeof(LineMoveStruct._LineMove_TypeDef));

Marshal.FreeHGlobal(pnt);

            
Motor._Mo.GoToPosInLine(ref _lmp);

解决方案

See Passing Structures[^].


这篇关于如何将结构引用传递给DLL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆