最近在做指纹识别的时候,遇到个问题,请高手们帮帮忙
厂商提供的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,我想是不是这个函数对应传的数据类型有问题。

解决方案 »

  1.   

            /// <summary>
            /// 捕获图象
            /// </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);
      

  2.   

    /// <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);调用  byte []RawImage=new byte;//忘记怎么写了,但你要保证足够大    CaptureImage(222,RawImag[0]);我记得是这样的,但不一定,仅供参考!
      

  3.   

    [DllImport("fpsiml.dll")]
    public static extern int CaptureImage(byte uwTimeoutS, [Out] byte[] pRawImage);
    按你的写法应该也没有问题,可能是你的第1个参数给的不对,或者调用的时机不对,导致函数执行失败。也可能正确的结果就是全255。
      

  4.   

    BYTE  uwTimeoutS  0 到 255
    UInt16 uwTimeoutS 0 到 4,294,967,295取值 = 200 试试pRawImage字节数组的每一个字节是255  也是合法数据 , 不能确定对错首先要知道预期的数据应该是什么. 找个测试实例对照一下.
      

  5.   

    预期的数据绝对不是全部都是255的,我下边还有用到pRawImage这个参数的C方法,一调用就会报
    尝试读取或写入受保护的内存。这通常指示其他内存已损坏的异常。
      

  6.   

    函数调用的时机是没问题的,方法的返回值是正确的,只是byte数组里边的数据时错误的
      

  7.   


    报错就是因为你传入或者传出的参数 不匹配 比如C传的4个字节的数据 但是你C# 只给分配了2个字节的变量 而由于 C#是不可以直接读写内存的 这样就会导致内存出错…就像是你没那么大个袋子却硬要装那么大的东西…自然内存是不允许你写的
      

  8.   

    byte[] pRawImage =new byte[9216];
    CaptureImage(10,  pRawImage);
    已经很大了,应该不存在容量问题了吧。
      

  9.   

            /// <summary>
            /// 捕获图象
            /// </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);这样试试,可能直接分配数组时,分配的地址空间不是连续的