2011-02-08 88 views
2


我试图从C#调用C函数。
下面是从C头文件中的函数:帮助在C#中编写C函数#

int __stdcall GetImageKN (unsigned short *ndat); 

而从关于此功能的文档:

ndat:
灰度图像 数据获取缓冲器的指针。
使用 应用程序始终保护 范围图像存储区域。
的 范围图像数据存储区域的大小应为:
160’ 120“2 = 38400字节
的 灰度被返回为8位,用于 从7位加倍。

如何调用此函数并读取图像数据?
感谢,
SW

回答

2

30KB是一个小缓冲区。如果你的函数跑得快,你可以依靠的默认封送处理行为,做到这一点:

[DllImport ("your.dll")] 
extern int GetImageKN (short[] ndat) ; 

var buffer = new short[160 * 120] ; 
var result = GetImageKN (buffer) ; 

即使它可以阻止长一段时间,你可以逃脱这个,如果你不叫很多这个功能线程一次。

1
[DllImport ("your.dll")] 
extern int GetImageKN (IntPtr ndat); 

可能会做......

编辑

一般指针表示为IntPtr的。 您可以创建一个管理的阵列和元帅它的IntPtr,

+0

但是应该传递一个数组的地址给函数。如何可以`ndat`代表这样一个数组? – Vlad 2011-02-08 19:01:57

+0

ndat是输出,我如何从IntPtr中读取数组值? – 2011-02-08 19:07:38

+0

@Weis:它看起来像ndat是你传入的参数,如果你期望函数修改它,你可以用[Out]属性修饰它,并且它将被修改。完成后,您还可以将其归还到托管阵列。请访问pinvoke.net了解如何使用它的大量示例。 – Alex 2011-02-08 19:15:21

0
ushort ndat= 123; 

GetImageKN(ref ndat); 
1

我会尝试以下方法:但是

[DllImportAttribute("your.dll", CallingConvention=CallingConvention.StdCall)] 
extern int GetImageKN(
    [Out, MarshalAs(UnmanagedType.LPArray, SizeConst=38400)] ushort[] ndat); 

不太清楚。