SDK для отпечатков пальцев - PullRequest
1 голос
/ 19 июня 2009

Я использую считыватель отпечатков пальцев 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.

Пожалуйста, помогите мне избежать этой ошибки.

Ответы [ 2 ]

1 голос
/ 19 июня 2009

"Эта функция пытается получить доступ к защищенной области памяти, которая может повредить систему"

это похоже на ошибку, которая появляется при вызове неуправляемого кода из управляемого кода.

В соответствии с ЭТОМ (вам нужно прокрутить весь путь вниз, чтобы увидеть ответы), вам может понадобиться добавить эти dll в решение вашего проекта, используя Ссылки -> Com. Это создаст оболочку управляемого кода так что вы можете использовать их в своем коде.

0 голосов
/ 13 сентября 2011

Мой друг, Аватар прав, вы должны вызывать неуправляемые функции 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...