gpt4 book ai didi

c# - P/Invoke 传递给 C 库函数的错误参数

转载 作者:太空宇宙 更新时间:2023-11-03 23:33:25 26 4
gpt4 key购买 nike

我一直在尝试从 C# 代码调用 ImageMagick 库中的 NewPixelRegionIterator 函数,但一直遇到参数传递问题。
更具体地说,这里是 NewPixelRegionIterator 的定义:

PixelIterator NewPixelRegionIterator(MagickWand *wand,const ssize_t x,
const ssize_t y,const size_t width,const size_t height)

下面是将此函数导入 C# 代码的代码:

[DllImport("libMagickWandDev.so")]
internal static extern PixelIterator NewPixelRegionIterator(IntPtr MagickWand,
IntPtr left, IntPtr top, UIntPtr width, UIntPtr height);

我导入 libMagickWandDev.so 而不是 libMagickWand.so 是因为 libMagickWandDev.so 是在启用调试支持的情况下编译的,因此我可以使用 gdb 运行单声道知道问题是否出在对 C 函数的调用中(事实上是)。

通过gdb发现的问题是调用NewPixelRegionIterator时如:

PixelIterator PixIt = PixelIteratorImports.NewPixelRegionIterator(MagickWandPtr,  
new IntPtr(x), new IntPtr(y), new UIntPtr(1), new UIntPtr(1));

通过 gdb 找到的实际传递的参数是:

Breakpoint 1, NewPixelRegionIterator (wand=0x7fffffffc7a8, x=10744336, y=5, 
width=6, height=1) at wand/pixel-iterator.c:418
  • 5 和 6 很好,这些是传递给函数的实际数字(虽然 x 应该等于 5 而 y 应该等于 6,使 宽度高度 都等于 1)。这意味着参数的顺序有点向右移动,0x7fffffffc7a8 可能是要返回的结构的一部分或其他内容。
  • 如果有帮助,10744336MagickWandPtr 的值(魔法棒的地址),因为将 wand 参数设置为此和 x 到一个合理的值,而在 gdb 中使函数运行得很好。
  • PixelIterator 是一个非常仔细映射的结构(我还通过 Marshal.SizeOf 验证了该结构的大小与实际 C 代码的 sizeof() 相同,均为 4192 字节)

再次感谢您。

最佳答案

你确定你可以从 PInvoke 函数返回一个结构吗?您不需要使用参数/指针返回它吗?

因为参数被移动了,所以我希望 PixelIterator* 类型的隐藏参数作为第一个或最后一个参数。返回类型为 void。这就是 C 编译器在幕后实现结构返回函数的方式。

在评论中,您解释说返回 PixelIterator* 可以解决问题。原因可能是 C 函数正在分配一个对象并返回它的指针。不过,该定义并未对此提供任何线索……无论如何,您可能需要在处理完返回的对象后释放该内存。

关于c# - P/Invoke 传递给 C 库函数的错误参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10049224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com