typedef struct pt_bir {
PT_BIR_HEADER Header;
BYTE Data[1]; //variable length based on pt_bir_header.Length
} PT_BIR
typedef struct pt_bir_header {
DWORD Length;
BYTE HeaderVersion;
BYTE Type;
WORD FormatOwner;
WORD FormatID;
CHAR Quality;
BYTE Purpose;
DWORD FactorsMask;
} PT_BIR_HEADER
И моя функция C:
PT_STATUS LoadFinger (
IN PT_CONNECTION hConnection,
IN PT_LONG lSlotNr,
IN PT_BOOL boReturnPayload,
OUT PT_BIR **ppStoredTemplate
)
Теперь мне нужно сделать обертку для вышеуказанной функции C в С#.
Как я должен PT_BIR**
структуру PT_BIR**
и как ее можно отменить после возврата этой функции?
Пожалуйста, помогите мне...
Вам нужно будет развязать это вручную. Прежде всего объявите структуру заголовка в С#
[StructLayout(LayoutKind.Sequential)]
public struct PT_BIR_HEADER
{
public int Length;
public byte HeaderVersion;
public byte Type;
public ushort FormatOwner;
public ushort FormatID;
public char Quality;
public byte Purpose;
public uint FactorsMask;
}
Затем для объявления функции объявите параметр ppStoredTemplate
следующим образом:
out IntPtr ppStoredTemplate
Как только функция вернется, и у вас есть ppStoredTemplate
, вы можете ее ppStoredTemplate
. Прежде всего вытащите заголовок:
PT_BIR_HEADER header = (PT_BIR_HEADER)Marshal.PtrToStructure(ppStoredTemplate,
typeof(PT_BIR_HEADER));
А затем вы можете распаковать данные:
byte[] data = new byte[header.Length];
Marshal.Copy(ppStoredTemplate + Marshal.SizeOf(typeof(PT_BIR_HEADER)), data, 0,
header.Length);