最近在做指纹识别的时候,遇到个问题,请高手们帮帮忙
厂商提供的dll里边有个方法extern "C" __declspec(dllimport) BOOL FPSAPI CaptureImage(BYTE uwTimeoutS,BYTE* pRawImage);c#调用映射是这样
/// <summary>
/// 捕获图象
/// </summary>
/// <param name="uwTimeoutS">超时时间</param>
/// <param name="pRawImage">存贮图象数据</param>
/// <returns>1成功,其他失败</returns>
[DllImport("fpsiml.dll", EntryPoint = "CaptureImage", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
public static extern int CaptureImage(UInt16 uwTimeoutS, byte[] pRawImage);
但是调用这个方法后,pRawImage字节数组的每一个字节都是255,我想是不是这个函数对应传的数据类型有问题。
厂商提供的dll里边有个方法extern "C" __declspec(dllimport) BOOL FPSAPI CaptureImage(BYTE uwTimeoutS,BYTE* pRawImage);c#调用映射是这样
/// <summary>
/// 捕获图象
/// </summary>
/// <param name="uwTimeoutS">超时时间</param>
/// <param name="pRawImage">存贮图象数据</param>
/// <returns>1成功,其他失败</returns>
[DllImport("fpsiml.dll", EntryPoint = "CaptureImage", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
public static extern int CaptureImage(UInt16 uwTimeoutS, byte[] pRawImage);
但是调用这个方法后,pRawImage字节数组的每一个字节都是255,我想是不是这个函数对应传的数据类型有问题。
/// 捕获图象
/// </summary>
/// <param name="uwTimeoutS">超时时间</param>
/// <param name="pRawImage">存贮图象数据</param>
/// <returns>1成功,其他失败</returns>
[DllImport("fpsiml.dll", EntryPoint = "CaptureImage", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Ansi)]
public static extern int CaptureImage(byte uwTimeoutS, byte[] pRawImage);
/// 捕获图象
/// </summary>
/// <param name="uwTimeoutS">超时时间</param>
/// <param name="pRawImage">存贮图象数据</param>
/// <returns>1成功,其他失败</returns>
[DllImport("fpsiml.dll", EntryPoint = "CaptureImage", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
public static extern int CaptureImage(UInt16 uwTimeoutS, byte pRawImage);调用 byte []RawImage=new byte;//忘记怎么写了,但你要保证足够大 CaptureImage(222,RawImag[0]);我记得是这样的,但不一定,仅供参考!
public static extern int CaptureImage(byte uwTimeoutS, [Out] byte[] pRawImage);
按你的写法应该也没有问题,可能是你的第1个参数给的不对,或者调用的时机不对,导致函数执行失败。也可能正确的结果就是全255。
UInt16 uwTimeoutS 0 到 4,294,967,295取值 = 200 试试pRawImage字节数组的每一个字节是255 也是合法数据 , 不能确定对错首先要知道预期的数据应该是什么. 找个测试实例对照一下.
尝试读取或写入受保护的内存。这通常指示其他内存已损坏的异常。
报错就是因为你传入或者传出的参数 不匹配 比如C传的4个字节的数据 但是你C# 只给分配了2个字节的变量 而由于 C#是不可以直接读写内存的 这样就会导致内存出错…就像是你没那么大个袋子却硬要装那么大的东西…自然内存是不允许你写的
CaptureImage(10, pRawImage);
已经很大了,应该不存在容量问题了吧。
/// 捕获图象
/// </summary>
/// <param name="uwTimeoutS">超时时间</param>
/// <param name="pRawImage">存贮图象数据</param>
/// <returns>1成功,其他失败</returns>
[DllImport("fpsiml.dll", EntryPoint = "CaptureImage", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Ansi)]
public static extern int CaptureImage(byte uwTimeoutS, IntPtr pRawImage);int len=9216;
IntPtr pRawImage= Marshal.AllocHGlobal(len);
CaptureImage(10,pRawImage);这样试试,可能直接分配数组时,分配的地址空间不是连续的