110,546
社区成员
发帖
与我相关
我的任务
分享
[StructLayout(LayoutKind.Explicit, Pack=1)]
public struct tagRealData
{
[FieldOffset(0)]
public byte byA;
[FieldOffset(1)]
public byte byB;
[FieldOffset(2)]
public UInt16 uC;
[FieldOffset(4)]
public float fD;
[FieldOffset(4)]
public byte byE;
[FieldOffset(4)]
public double dF;
}
public int ReadStatus()
{
// 获得访问数组,并初始化
TAInterface.tagRealData[] rData = GetRealDataStruct();
if (rData == null)
return 0;
if (rData.Length == 0)
return 0;
// 结构体类型和IntPtr类型的大小
int nSizeofRD = Marshal.SizeOf(typeof(TAInterface.tagRealData));
int nSizeofIntPtr = Marshal.SizeOf(typeof(IntPtr));
// 转换为指针,首先建立一个与之同样大小的数组
IntPtr[] pArray = new IntPtr[rData.Length];
for (int i = 0; i < rData.Length; i++)
pArray[i] = Marshal.AllocHGlobal(nSizeofRD * rData.Length);
// 将数组转换为一个指针
IntPtr pRD = Marshal.AllocHGlobal(nSizeofIntPtr * rData.Length);
// 把C#结构体数组拷贝至这个指针
Marshal.Copy(pArray, 0, pRD, 1);
for (int i = 0; i < rData.Length; i++)
Marshal.StructureToPtr(rData[i], (IntPtr)((UInt32)pRD + i * nSizeofIntPtr), true);
// 获取数据
int nRead = TAInterface.GetRealData(1, pRD, rData.Length);
// 得到结果分析
Equipment equip;
TAInterface.tagRealData r;
for (int i = 0; i < rData.Length; i++ )
{
r = (TAInterface.tagRealData)Marshal.PtrToStructure((IntPtr)((UInt32)pRD + i * nSizeofIntPtr), typeof(TAInterface.tagRealData));
if ((equip = Get(r.uC)) == null)
continue;
equip.SetStatus((byte)(r.byE % 2));
}
// 清理内存
Marshal.DestroyStructure(pRD, typeof(TAInterface.tagRealData));
Marshal.FreeHGlobal(pRD);
return nRead;
}
public int ReadStatus()
{
// 获得访问数组,并初始化
TAInterface.tagRealData[] rData = GetRealDataStruct();
if (rData == null)
return 0;
if (rData.Length == 0)
return 0;
// 结构体类型和IntPtr类型的大小
int nSizeofRD = Marshal.SizeOf(typeof(TAInterface.tagRealData));
int nSizeofIntPtr = Marshal.SizeOf(typeof(IntPtr));
// 转换为指针,首先建立一个与之同样大小的数组
IntPtr[] pArray = new IntPtr[rData.Length];
//for (int i = 0; i < rData.Length; i++)
pArray[0] = Marshal.AllocHGlobal(nSizeofRD * rData.Length);
// 将数组转换为一个指针
IntPtr pRD = Marshal.AllocHGlobal(nSizeofIntPtr * 1);
// 把C#结构体数组拷贝至这个指针
Marshal.Copy(pArray, 0, pRD, 1);
for (int i = 0; i < rData.Length; i++)
Marshal.StructureToPtr(rData[i], (IntPtr)((UInt32)pRD + i * nSizeofRD), true);
// 获取数据
int nRead = TAInterface.GetRealData(1, pRD, rData.Length);
// 得到结果分析
Equipment equip;
TAInterface.tagRealData r;
for (int i = 0; i < rData.Length; i++ )
{
r = (TAInterface.tagRealData)Marshal.PtrToStructure((IntPtr)((UInt32)pRD + i * nSizeofRD), typeof(TAInterface.tagRealData));
// 此处略去......
}
// 清理内存
Marshal.DestroyStructure(pRD, typeof(TAInterface.tagRealData));
Marshal.FreeHGlobal(pRD);
return nRead;
}
int __declspec(dllexport) GetRealData(int type, PRealData pRD, int num);
[DllImport("GetRData.dll", EntryPoint = "#4")] // 测试
public static extern int GetRealData(int type, IntPtr pRD, int num);