2

HRM システム用の指紋ログインを開発しています。SDK で提供されるサンプル コードにより、1 つのテンプレートで検証できます。これがコードのセグメントです。

 
    BSTypes.ABS_BIR ppEnrolledTemplate; //Load the template array to ppEnrolledTemplate

    IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ppEnrolledTemplateArray[i]));

    Marshal.StructureToPtr(ppEnrolledTemplateArray[i], ptr, false);

    res = BSApi.ABSVerify(conn, ref op, 1, ref ptr, ref matching_slot, 0);

SDK のドキュメント (リンク) によると、ABSVerify メソッドを使用すると、テンプレート配列をパラメーターの 1 つとして入力できます。 ABS_BIR 構造体配列をマーシャリングする際に問題が発生しています。ABS_BIR の構造体は次のとおりです。


[StructLayout(LayoutKind.Sequential)]      
        public struct ABS_BIR
        {
            public ABS_BIR_HEADER Header;   // BIR header
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2560)]
            public byte[] Data;     // The data composing the fingerprint template.
        }

これが私が思いついた解決策です。ReadyTemplate() というメソッドを書きました

private void readTemplate() {
        //read template from binary file
        for (int i = 0; i < 4; i++)
        {
            FileStream objFileStream;
            BinaryReader objBinaryReader;
            try
            {
                // ========== Updated by bubz ============
                byte[] data;
                objFileStream = new FileStream(i + ".bin", FileMode.Open);
                objBinaryReader = new BinaryReader(objFileStream);
                data = objBinaryReader.ReadBytes((int)objFileStream.Length);

                GCHandle pinnedData = GCHandle.Alloc(data, GCHandleType.Pinned);
                ppEnrolledTemplateArray[i] = (BSTypes.ABS_BIR)Marshal.PtrToStructure(pinnedData.AddrOfPinnedObject(), typeof(BSTypes.ABS_BIR));

                displayOut(0, 0, "Template retrieved from PC.");
                displayOut(0, 0, i.ToString());
                objBinaryReader.Close();

                // ============ end ====================


            }

            catch (FileNotFoundException FileEx)
            {
                displayOut(2, 0, FileEx.Message);
                return;
            }

            catch (Exception Ex)
            {
                displayOut(2, 0, Ex.Message);
                return;
            }
        }

    }

助けてください。ありがとう。

4

1 に答える 1

0

私が間違っているかどうかを確認してください。ただし、構造体を配列にマーシャリングするには、次の操作を実行できることをどこかで読んだと思います。

[StructLayout(LayoutKind.Sequential)]
[MarshalAs(UnmanagedType.ByValArray)]      
public struct ABS_BIR
{
    public ABS_BIR_HEADER Header;   // BIR header

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2560)]
    public byte[] Data;     // The data composing the fingerprint template.
}

そして、配列の代わりに構造体を渡すだけです。

幸運を

于 2012-01-19T17:57:00.130 に答える