我使用指纹识别器UFP20。SDK提供2个DLL文件(WIS_API.dll,WisCmos2.dll)。不幸的是他们没有提供c#演示代码。我可以连接设备并测试设备。它工作得很好。
问题: 我无法捕捉指纹甚至捕获初始化功能完美工作。 我调用WIS_Capture()函数时遇到错误。错误 - “此功能试图访问受保护的内存区域,这可能会损坏系统”
有关该功能的更多详情: -
WIS_Capture
Synopsis
int WINAPI WIS_Capture( HANDLE hInit, int *rCount )
Parameter
hInit The handle returned by WIS_InitDriver()
rCount A value used internally by the function. The developer MUST
initial this value to 0 before use.
Description :
To snap a fingerprint from the fingerprint device to the main memory by a
fingerprint image quality control process. The fingerprint quality control
cycle needs several frames of images and will continuously return the
status of the fingerprint after each frame of image captured.
请帮我避免这个错误。
答案 0 :(得分:1)
“此功能尝试访问受保护的内存区域,可能会损坏系统”
这听起来类似于从托管代码调用非托管代码时出现的错误。
根据THIS(您需要一直向下滚动以查看答案),您可能需要使用引用 - >将这些dll添加到项目解决方案中。 Com。这将创建一个托管代码包装器,以便您可以在代码中使用它们。
答案 1 :(得分:0)
我的朋友,Avatar是对的,您必须使用以下代码调用非托管dll函数:
namespace SDK_DLL_NS
{
internal class SDK_DLL
{
[DllImport("../../../SDK/SDK.dll")]
public static extern unsafe int SDK_AMethod(int devHandle, IntPtr buf, int length);
public const int MAX_LEN = 12345;
.....
}
}
现在,这只是作业的接口部分,根据定义.NET虚拟机内存不是固定的,这就是dll所期望的,幸运的是我们有System.Runtime.InteropServices命名空间来帮助它的GCHandle结构它提供了一种从非托管代码访问托管对象的方法。所以我认为代码可能是这样的,我们需要分配一些内存“本地代码”:
SDKdllBuffer = new byte[SDK_DLL.MAX_LEN];
pinnedBuffer = GCHandle.Alloc(SDKdllBuffer, GCHandleType.Pinned);
unsafe
{
SDK_DLL.SDK_AMethod(handle, pinnedBuffer.AddrOfPinnedObject(),MAX_LEN);
}
希望这会给你一个想法。祝好运。 涓