当前位置:编程学习 > C#/ASP.NET >>

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”: 内部限制: 结构太复杂或太大。 --------------------编程问答--------------------
引用 1 楼 isjoe 的回复:
C# code

[StructLayout(LayoutKind.Sequential)]
        public struct FULLPARAM
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
            public Int16[] cmd;

     ……

指针没那么恐怖吧。、
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,