c#调用dll函数,涉及指针
大家好,我现在处理的是一个仪器控制的编程,用c#(c++不太熟悉,不然就可以直接用c++编程了)。是调用dll中的两个函数:
short OOI_Flexible_Acquisition(OOI_FAM_PARAM* fp);
short OOI_FullScan(FULLPARAM* fp);
OOI_FAM_PARAM和FULLPARAM是两个结构体,其中FULLPARAM中还含有一个指针数组;
struct FULLPARAM
{ short cmd[8];
short fdc[8];
word dsf[8];
short boxcar[8];
short average[8];
short scan_dark[8];
short correct_dark[8];
short extrig[8];
float* chdat[8]; //指向仪器获得的数据保存位置,0-7代表八个通道,每个通道对应2048像素点的光强}
而指针*chdat[i]是指向一个2048大小的数组。
现在要在c#中成功调用这两个函数,获得保存在数组中的值该怎么弄呢?
OOI_FAM_PARAM 结构中没有数组,我直接这样导入和调用的,可以吗?
[DllImport("OOIDRV32.DLL")]
public static extern short OOI_Flexible_Acquisition(ref OOI_FAM_PARAM fp);
调用:OOI_FAM_PARAM str;OOI_Flexible_Acquisition(ref str); --------------------编程问答--------------------
[StructLayout(LayoutKind.Sequential)]
public struct FULLPARAM
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public Int16[] cmd;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public Int16[] fdc;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public Int16[] dsf;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public Int16[] boxcar;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public Int16[] average;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public Int16[] scan_dark;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public Int16[] correct_dark;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public Int16[] extrig;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8*2048)]
public float[] chdat;
}
调用时候一定使用ref --------------------编程问答-------------------- 楼上数得对 --------------------编程问答-------------------- 谢谢啊,c++中的word和short都对应int16吗?
还有那个 public float[] chdat;声明是一维的,大小定义的却是8*2048;比如我想创建一个新的数组
float [,]TSMUL=new float[8,2048];
该怎么把chdat中的值转到TSMUL中,chdal[i]应该是对用的每一个通道数据存储的地址吧?
我按你的方法试了一下,OOI_FullScan(ref str);
调试程序语法没错误,运行时显示:无法封送处理“parameter #1”: 内部限制: 结构太复杂或太大。 --------------------编程问答--------------------
指针没那么恐怖吧。、
补充:.NET技术 , C#