2009-06-19 5 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 (вам нужно прокрутить весь путь вниз, чтобы увидеть ответы), вам может потребоваться добавить эти dll к вашему проектному решению, используя ссылки -> Com.Это создаст управляемую оболочку кода, чтобы вы могли их использовать в вашем коде.

+0

Спасибо за быстрый ответ. Но я не могу добавить ссылку на dll. Он показывает ошибку «Файл u выбрал недействительную сборку или COM-компонент» при добавлении ссылки. DLL предоставляет SDK. Я знаю только функции. Пожалуйста, дайте мне другое решение для решения этой проблемы. – Anoop

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); 
} 

Надеется, что это даст вам идею. Удачи. Juan

Смежные вопросы