如何将结构引用传递给DLL [英] How to pass reference of structure to DLL
本文介绍了如何将结构引用传递给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屋!
查看全文