我一直在尝试从C#代码调用ImageMagick库中的NewPixelRegionIterator函数,并且已经运行到参数传递问题。
更具体地说,这里是NewPixelRegionIterator的定义:P /调用传递给C库函数的错误参数
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 ,使得宽度和高度均等于1)。这意味着参数的顺序是向右移动的,0x7fffffffc7a8可能是要返回的结构的一部分或其他东西。
- 如果有帮助,是MagickWandPtr(该Magick魔杖的地址)的值,因为设置棒参数,这和X到一个理智的价值,而在gdb使得功能运行正好。
- PixelIterator是非常小心地映射(我也已经验证了该结构的通过Marshal.SizeOf)的大小和实际的C代码的的sizeof(是相同的4192个字节)
再次一个结构,由于提前。
检查C api使用的调用对话。你最可能的选择是Cdecl或stdcall。 DllImportAttribute的默认值是WinApi,它将默认在除Win CE以外的任何其他位置进行调用。 – user957902 2012-04-06 21:17:48
您确定只能从PInvoke函数返回结构吗?你不需要使用参数/指针返回它吗? – usr 2012-04-06 21:19:32
我猜想问题的一部分是'size_t'的宽度...它可能是32位,但是你传递的是IntPtr,它将在64位系统上为64位。 (另外,你为什么使用一些参数的UIntPtr和其他的IntPtr?)但是想想看,值被推到了右边,所以也许你正在用64位指针调用一个32位函数?尝试在32位进程中运行整个事情。 – phoog 2012-04-06 21:19:39