Я пытаюсь интегрировать устройство U.are.U 5300 Fingerprint в свое веб-приложение, используя сервис windows. Я использую SignalR для общения, но это не проблема. У меня есть небольшой фрагмент кода, который возвращает первое устройство, подключенное к машине.
public Reader GetReader()
{
if (this._reader == null)
{
this._reader = ReaderCollection.GetReaders()[0];
var openResult = this._reader.Open(Constants.CapturePriority.DP_PRIORITY_COOPERATIVE);
_res = this._reader.GetDefaultRes();
}
return this._reader;
}
Я декомпилировал аппаратную DLL, и это фактический код, который они используют (не уверен, что это поможет).
public static ReaderCollection GetReaders()
{
unsafe
{
ReaderCollection readerCollections;
using (Tracer tracer = new Tracer("ReaderCollection::GetReaders"))
{
Constants.ResultCode resultCode = Constants.ResultCode.DP_DEVICE_FAILURE;
if (ReaderCollection.instance == null)
{
ReaderCollection.instance = new ReaderCollection();
try
{
ReaderCollection.instance.m_items = new List<Reader>();
NativeMethods.SetDllDirectory();
resultCode = NativeMethods.dpfpdd_init();
tracer.TraceResult((int)resultCode);
if (!resultCode.Equals(Constants.ResultCode.DP_SUCCESS) && (int)resultCode != 1)
{
ReaderCollection.instance = null;
throw new SDKException(resultCode, "Could not initialize driver", new InvalidOperationException());
}
resultCode = NativeMethods.dpfj_select_engine((IntPtr)0, Constants.EngineType.DP_ENGINE_DPFJ);
tracer.TraceResult((int)resultCode);
if (!resultCode.Equals(Constants.ResultCode.DP_SUCCESS))
{
ReaderCollection.instance = null;
throw new SDKException(resultCode, "Could not slect Engine Type", new InvalidOperationException());
}
}
catch (Exception exception)
{
tracer.Trace(exception.Message);
ReaderCollection.instance = null;
throw new SDKException(Constants.ResultCode.DP_FAILURE, string.Empty, null);
}
}
resultCode = Constants.ResultCode.DP_FAILURE;
int num = 0;
NativeMethods.DPFPDD_DEV_INFO[] dPFPDDDEVINFOArray = null;
try
{
resultCode = NativeMethods.dpfpdd_query_devices(ref num, dPFPDDDEVINFOArray);
if (!num.Equals(0))
{
dPFPDDDEVINFOArray = new NativeMethods.DPFPDD_DEV_INFO[num];
dPFPDDDEVINFOArray[0].size = Marshal.SizeOf(dPFPDDDEVINFOArray[0]);
resultCode = NativeMethods.dpfpdd_query_devices(ref num, dPFPDDDEVINFOArray);
tracer.Trace(string.Format("dpfpdd_query_devices called, count is {0}", num.ToString()));
}
ReaderCollection.Refresh(dPFPDDDEVINFOArray);
readerCollections = ReaderCollection.instance;
}
catch (Exception exception1)
{
tracer.Trace(exception1.Message);
throw new SDKException(Constants.ResultCode.DP_FAILURE, string.Empty, null);
}
}
return readerCollections;
}
}
Этот код отлично работает в приложении формы windows (настольное приложение). Но оно не может обнаружить мое устройство в службе windows.
- Я установил разрешение для службы windows как «Локальная система»
- Включен параметр для «Разрешить службе взаимодействовать с рабочим столом»
Есть ли у нас какие-либо специальные разрешения (windows или уровень приложения), которые нам необходимо установить для обнаружения устройства или взаимодействия через службу windows?