2009-06-19 114 views
1

我使用的是指纹识别器UFP20.SDK提供了2个DLL文件(WIS_API.dll,WisCmos2.dll)。不幸的是,他们不提供c#演示代码。我可以连接设备并测试设备。它的工作完美。指纹SDK

问题: 我无法捕获指纹甚至捕获初始化函数的完美工作。 当我调用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. 

请帮我避免这种错误。

回答

1

“此功能试图访问受保护的内存区域,这可能损坏系统”

这听起来很相似,当您从托管代码调用非托管代码你的错误。

根据THIS(您需要一直向下滚动以查看答案),您可能需要使用引用 - > Com将这些dll添加到项目解决方案中。这将创建一个托管代码包装器,以便您可以使用它们在你的代码中。

+0

感谢您的快速回复。但我不能添加我的dll的参考。当我添加引用时,它显示错误“该文件选择的不是有效的程序集或COM组件”。该DLL提供的SDK。我只知道功能。请给我另一个解决方案来解决这个问题。 – Anoop 2009-06-20 06:40:40

0

我的朋友,阿凡达是正确的,你必须调用非托管的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); 
} 

希望这给你一个想法。祝你好运。 胡安