P /调用传递给C库函数的错误参数

时间:2012-04-06 21:03:42

标签: c# c pinvoke

我一直在尝试从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运行mono知道问题是否在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,使 width height 都等于1)。这意味着参数的顺序向右移动,0x7fffffffc7a8可能是要返回的结构的一部分或其他内容。
  • 如果有帮助, 10744336 MagickWandPtr (Magick Wand的地址)的值,因为将 wand 参数设置为此和 x 到一个合理的值,而在gdb中使函数运行得很好。
  • PixelIterator是一个非常仔细映射的结构(我还验证了通过Marshal.SizeOf和实际C代码的sizeof()的结构大小是相同的4192字节)

再一次,先谢谢。

1 个答案:

答案 0 :(得分:2)

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

因为参数被移位,我希望PixelIterator *类型的隐藏参数作为第一个或最后一个参数。还有一种回归式的虚空。这就是C编译器在底层实现结构返回功能的方法。

在评论中,您解释说返回PixelIterator *可以解决问题。原因可能是C函数正在分配一个对象并返回它的指针。虽然定义没有给出一个线索,但是......无论如何,当你完成返回的对象时,你可能需要释放内存。

相关问题