帮助在 C# 中封送 C 函数

发布于 10-16 05:23 字数 372 浏览 6 评论 0原文


我正在尝试从 C# 调用 C 函数。
以下是 C 头文件中的函数:

int __stdcall GetImageKN (unsigned short *ndat );

以及有关此函数的文档:

ndat :​​
灰度图像的指针 数据采集​​缓冲区。
始终安全 范围图像存储区域使用 应用程序。
的大小 范围图像数据存储区域应为:
160' 120'2 = 38400 字节
灰度值以 8 位形式返回 是 7 位的两倍。

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

I'm trying to call a C function from C#.
Here is the function from the C header file :

int __stdcall GetImageKN (unsigned short *ndat );

And from the documentation about this function :

ndat :
Pointer of the grayscale image
data acquiring buffer.
Always secure
the range image storage area using the
application program.
The size of the
range image data storage area should be:
160’ 120 ‘2 = 38400 bytes
The
grayscales are returned as 8 bit that
is doubled from 7-bit.

How do I invoke this function and read the image data ?

Thanks,

SW

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

何以心动2024-10-23 05:23:06

30Kb 是一个小缓冲区。如果您的函数运行速度很快,您可以依赖默认的封送行为并执行以下操作:

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

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

即使它可能会阻塞很长时间,如果您不在多个线程上同时调用此函数,您也可以摆脱这种情况。

30Kb is a small buffer. If your function runs quickly, you can rely on default marshaling behaviour and do this:

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

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

Even if it can block for a long time, you can get away with this if you don't call this function on many threads at once.

不及他2024-10-23 05:23:06
[DllImport ("your.dll")]
extern int GetImageKN (IntPtr ndat);

可能会做...

编辑

通常指针表示为 IntPtr。
您可以创建一个托管数组并将其编组到 IntPtr,

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

will probably do...

EDIT

generally pointers are represented as IntPtr.
you can create a managed array and Marshal it to IntPtr,

天暗了我发光2024-10-23 05:23:06

我会尝试以下操作:

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

但是不太确定。

I would try the following:

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

Not really sure however.

唯憾梦倾城2024-10-23 05:23:06
ushort ndat= 123;

GetImageKN(ref ndat);
ushort ndat= 123;

GetImageKN(ref ndat);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文