VC的结构
struct HY_RECT_S
{
long lLeft;
long lRight;
long lTop;
long lBottom;
};
struct ID_CARD_S
{
char szText[10][256];
HY_RECT_S idRect[10];
};
花了很久才解决 贴出来代码 跟遇到同样问题的朋友分享下
Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; namespace Test
{
public partial class Form1 : Form
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct HY_RECT_S
{
public long lLeft;
public long lRight;
public long lTop;
public long lBottom;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct ID_CARD_S
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2560)]
public byte[] szText;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public HY_RECT_S[] idRect;
}
public extern static int Get_IdcData(
int iCardType,
string szFileNameIn,
String szFullFileNameOut,
String szHeadFileNameOut,
ref ID_CARD_S pstOut);
[DllImport("D:\\DLL\\IDRCore.dll", EntryPoint = "Device_Open", CharSet = CharSet.Ansi)]
public static extern int Device_Open();
unsafe public static extern int Get_IdcPic(int iCardType, String szFileNameIn);
{
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
ID_CARD_S idCardS = new ID_CARD_S();
StringBuilder szFullFileNameOut = new StringBuilder(1024);
StringBuilder szHeadFileNameOut = new StringBuilder(1024);
unsafe
{
//{
//IntPtr ipIds = (IntPtr)pids;
int i0=Device_Open();
byte[] result = new byte[256];
String[] strResult = new String[10];
int k = 0;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 256; j++)
{
result[j] = idCardS.szText[k++];
}
MessageBox.Show(s);
}
{
Encoding myEncoding = Encoding.GetEncoding("gb2312");
string sData = myEncoding.GetString(characters);
string constructedString = sData.Trim().TrimEnd('\0');
return (constructedString);
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; namespace Test
{
public partial class Form1 : Form
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct HY_RECT_S
{
public long lLeft;
public long lRight;
public long lTop;
public long lBottom;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct ID_CARD_S
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2560)]
public byte[] szText;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public HY_RECT_S[] idRect;
}
[DllImport(
"D:\\DLL\\IDRCore.dll", EntryPoint = "Get_IdcData", CharSet = CharSet.Ansi)]public extern static int Get_IdcData(
int iCardType,
string szFileNameIn,
String szFullFileNameOut,
String szHeadFileNameOut,
ref ID_CARD_S pstOut);
[DllImport("D:\\DLL\\IDRCore.dll", EntryPoint = "Device_Open", CharSet = CharSet.Ansi)]
public static extern int Device_Open();
[DllImport(
"D:\\DLL\\IDRCore.dll", EntryPoint = "Get_IdcPic", CharSet = CharSet.Ansi)]unsafe public static extern int Get_IdcPic(int iCardType, String szFileNameIn);
public Form1()
{
InitializeComponent();
}
private void button4_Click(object sender, EventArgs e)
{
ID_CARD_S idCardS = new ID_CARD_S();
StringBuilder szFullFileNameOut = new StringBuilder(1024);
StringBuilder szHeadFileNameOut = new StringBuilder(1024);
unsafe
{
//fixed (ID_CARD_S * pids = &idCardS)
//{
//IntPtr ipIds = (IntPtr)pids;
int i0=Device_Open();
int i1 = Get_IdcPic(2, "C:\\1.bmp");
int i2 = Get_IdcData(2, "C:\\1.bmp", "C:\\2.bmp", "C:\\3.bmp", ref idCardS);
byte[] result = new byte[256];
String[] strResult = new String[10];
int k = 0;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 256; j++)
{
result[j] = idCardS.szText[k++];
}
strResult[i]
}
string s = FromASCIIByteArray(idCardS.szText);
MessageBox.Show(s);
//}
}
}
public static String FromASCIIByteArray(byte[] characters)
{
Encoding myEncoding = Encoding.GetEncoding("gb2312");
string sData = myEncoding.GetString(characters);
string constructedString = sData.Trim().TrimEnd('\0');
return (constructedString);
}
}
}