c#调用dll函数,涉及指针

问题描述

大家好,我现在处理的是一个仪器控制的编程,用c#(c++不太熟悉,不然就可以直接用c++编程了)。是调用dll中的两个函数:shortOOI_Flexible_Acquisition(OOI_FAM_PARAM*fp);shortOOI_FullScan(FULLPARAM*fp);OOI_FAM_PARAM和FULLPARAM是两个结构体,其中FULLPARAM中还含有一个指针数组;structFULLPARAM{shortcmd[8];shortfdc[8];worddsf[8];shortboxcar[8];shortaverage[8];shortscan_dark[8];shortcorrect_dark[8];shortextrig[8];float*chdat[8];//指向仪器获得的数据保存位置,0-7代表八个通道,每个通道对应2048像素点的光强}而指针*chdat[i]是指向一个2048大小的数组。现在要在c#中成功调用这两个函数,获得保存在数组中的值该怎么弄呢?OOI_FAM_PARAM结构中没有数组,我直接这样导入和调用的,可以吗?[DllImport("OOIDRV32.DLL")]publicstaticexternshortOOI_Flexible_Acquisition(refOOI_FAM_PARAMfp);调用:OOI_FAM_PARAMstr;OOI_Flexible_Acquisition(refstr);

解决方案

解决方案二:
[StructLayout(LayoutKind.Sequential)]publicstructFULLPARAM{[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]cmd;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]fdc;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]dsf;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]boxcar;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]average;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]scan_dark;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]correct_dark;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]extrig;[MarshalAs(UnmanagedType.ByValArray,SizeConst=8*2048)]publicfloat[]chdat;}

调用时候一定使用ref
解决方案三:
楼上数得对
解决方案四:
谢谢啊,c++中的word和short都对应int16吗?还有那个publicfloat[]chdat;声明是一维的,大小定义的却是8*2048;比如我想创建一个新的数组float[,]TSMUL=newfloat[8,2048];该怎么把chdat中的值转到TSMUL中,chdal[i]应该是对用的每一个通道数据存储的地址吧?我按你的方法试了一下,OOI_FullScan(refstr);调试程序语法没错误,运行时显示:无法封送处理“parameter#1”:内部限制:结构太复杂或太大。
解决方案五:
引用1楼isjoe的回复:

C#code[StructLayout(LayoutKind.Sequential)]publicstructFULLPARAM{[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]publicInt16[]cmd;……

指针没那么恐怖吧。、

时间: 2024-08-01 19:56:57

c#调用dll函数,涉及指针的相关文章

调用成员函数this指针突然变为NULL

问题描述 调用成员函数this指针突然变为NULL 成员函数在调用另一个成员函数的时候,this指针变成了NULL,想请问一下是什么原因,该怎么解决呢? (数组溢出已经检查过了,都没有) 解决方案 搞清this永远指调用当前对象,这样就不会出错了 解决方案二: 贴出代码来看看呗. 单从你的问题描述来看,this指针是null,一般是因为调用这个成员函数的对象本身就是null.例如: class A{...} int main(){ A* p = NULL; p->method(); } 进入这个

调用DLL函数的问题

问题描述 DLL函数带一个字节数组BYTE()参数,该数组返回时比传送时多4个字节.这个问题怎么弄? 解决方案 解决方案二:把函数声明贴出来看看吧解决方案三:....一个是输入参数一个是函数(方法)的返回.又不是同一个东西.两个数组又不是一个东西.有什么好比较的.

调用DLL函数时报告堆栈异常的解决方法

The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention. 解决方法: 1. VC6   工程->设置->C/C++-&g

c#调用c++dll函数时参数传递的问题?怎样正确传值?

问题描述 c#调用c++dll函数时参数传递的问题?怎样正确传值? 在c++项目cpptest.dll中定义: struct A { int X; int Y; }; extern "C" __declspec(dllexport) int fun1(A *a); int fun1(A *a) { return a->X; } 在C#项目中定义: [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] class

求教个delphi调用DLL的函数说明怎么写

问题描述 求教个delphi调用DLL的函数说明怎么写 函数名 ZtDevice_CR_ReadTrack3 出口参数 byTrackDataThree BYTE * 3 出口参数 nDataThreeLen INT * 入口参数 nTimeOut INT 返回值 short 我的声明 unction ZtDevice_CR_ReadTrack2(out byTrackDataTwo:pBYTE; out nDataTwoLen:Integer;nTimeOut:integer):integer

函数指针 c语言 指针-C语言指向函数的指针的调用

问题描述 C语言指向函数的指针的调用 int *d_bubblesort(int a[]int n)//数组长度为n的冒泡降序排序{int ij;int temp;for(i=0;i {for(j=n-1;j>i;j--){if(a[j]>a[j-1]){temp=a[j-1];a[j-1]=a[j];a[j]=temp;} }}return(a);} void main(){int i;int *p;int a[10]={65412398710};int (*fun)(intint);fun

vb-VB 调用fortran函数(已经生成dll),怎么实现数组的传递?

问题描述 VB 调用fortran函数(已经生成dll),怎么实现数组的传递? VB调用fortran生成的dll.传数值,我已经实现,但是传数组地址没成功, 但是用C语言就可以找到数组的首地址,但是VB就不行,请VB的高手指教 fortran 代码如下(生成dll): subroutine ComputeFwd_DC1D(Pm,nParams,AB2,nd) !DEC$ ATTRIBUTES REFERENCE::Pm,nParams,AB2,nd implicit none integer

c#调用DLL回调函数问题,硬盘录像机,NetSdk.dll,H264_DVR

问题描述 c#调用DLL回调函数问题,硬盘录像机,NetSdk.dll,H264_DVR 最近使用C#编写一个摄像头的本地监控及录像程序,硬件开发商把所有的功能实现封装到DLL里了,我通过C#调用之. 具体要实现的功能如下: 1.摄像头通过DAS功能,主动向监控主机的IP发送数据. 2.监控主机监听固定端口,处理接收到的数据. 我自己的思路: 1.新建一个Dictionary存储已上线设备的信息. 2.程序初始化H264_DVR_Init(DisCallback, 0),DisCallback为

回调函数 dll-VC调用dll里面的回调函数

问题描述 VC调用dll里面的回调函数 我调用一个dll里面的回调函数,原型说明如下,请问怎么调用?感觉原型有问题,和我看的资料不一样 void (WINAPI SetCallback)(long caller,long userdata); 设置回调,回调函数将接收终端传过来的数据和消息 回调函数的参数为 Void CALLBACK eipcalback(int cmdtype,char *ip,char *rectime,char *lpn,char *imgfile,BYTE *imgda