我试图从C#调用C函数。
下面是从C头文件中的函数:帮助在C#中编写C函数#
int __stdcall GetImageKN (unsigned short *ndat);
而从关于此功能的文档:
ndat:
灰度图像 数据获取缓冲器的指针。
使用 应用程序始终保护 范围图像存储区域。
的 范围图像数据存储区域的大小应为:
160’ 120“2 = 38400字节
的 灰度被返回为8位,用于 从7位加倍。
如何调用此函数并读取图像数据?
感谢,
SW
我试图从C#调用C函数。
下面是从C头文件中的函数:帮助在C#中编写C函数#
int __stdcall GetImageKN (unsigned short *ndat);
而从关于此功能的文档:
ndat:
灰度图像 数据获取缓冲器的指针。
使用 应用程序始终保护 范围图像存储区域。
的 范围图像数据存储区域的大小应为:
160’ 120“2 = 38400字节
的 灰度被返回为8位,用于 从7位加倍。
如何调用此函数并读取图像数据?
感谢,
SW
30KB是一个小缓冲区。如果你的函数跑得快,你可以依靠的默认封送处理行为,做到这一点:
[DllImport ("your.dll")]
extern int GetImageKN (short[] ndat) ;
var buffer = new short[160 * 120] ;
var result = GetImageKN (buffer) ;
即使它可以阻止长一段时间,你可以逃脱这个,如果你不叫很多这个功能线程一次。
[DllImport ("your.dll")]
extern int GetImageKN (IntPtr ndat);
可能会做......
编辑
一般指针表示为IntPtr的。 您可以创建一个管理的阵列和元帅它的IntPtr,
ushort ndat= 123;
GetImageKN(ref ndat);
我会尝试以下方法:但是
[DllImportAttribute("your.dll", CallingConvention=CallingConvention.StdCall)]
extern int GetImageKN(
[Out, MarshalAs(UnmanagedType.LPArray, SizeConst=38400)] ushort[] ndat);
不太清楚。
但是应该传递一个数组的地址给函数。如何可以`ndat`代表这样一个数组? – Vlad 2011-02-08 19:01:57
ndat是输出,我如何从IntPtr中读取数组值? – 2011-02-08 19:07:38
@Weis:它看起来像ndat是你传入的参数,如果你期望函数修改它,你可以用[Out]属性修饰它,并且它将被修改。完成后,您还可以将其归还到托管阵列。请访问pinvoke.net了解如何使用它的大量示例。 – Alex 2011-02-08 19:15:21