C++ 定义的 typedef struct {...}IDCARD_ALL; 结构 和方法 extern "C" int __stdcal
这个是C++的一个结构程序代码:
typedef struct { char name[40]; //姓名 char sex[10]; //性别 char people[20]; //民族,护照识别时此项为空 char birthday[50]; //出生日期 char address[200]; //地址,在识别护照时导出的是国籍简码、 char signdate[50]; //签发日期,在识别护照时导出的是有效期至 char validterm[50]; //有效期,在识别护照时为空, char number[40]; //证件编码,在识别护照时为护照号 ;识别港澳通行证内页时为港澳证件号码 char other[100]; //备用,在识别护照时导出护照类型,识别港澳通行证封页时证件号; char szCodeOne[256];//护照、台胞证、港澳通行证封页第一行机读码, char szCodeTwo[256];//护照、台胞证、港澳通行证封页第二行机读码, }IDCARD_ALL; 然后一个方法 extern "C" int __stdcall RecogIdcardOnlyALL( LPCTSTR imgfile_name, IDCARD_ALL & card, bool bSaveResultFile, int nHandPrint, int nContent, char* HeadImgFName );
我用 C# 这样转换
程序代码:
/// <summary> /// 扫描时设置参数的结构体 /// </summary> [StructLayout(LayoutKind.Sequential, Size = 256)] public struct IDCARD_ALL { /// <summary> /// 姓名 /// </summary> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)] public string name; /// <summary> /// 性别 /// </summary> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)] public string sex; /// <summary> /// 民族 护照识别时此项为空 /// </summary> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] public string people; /// <summary> /// 出生日期 /// </summary> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] public string birthday; /// <summary> /// 地址 在识别护照时导出的是国籍简码 /// </summary> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)] public string address; /// <summary> /// 签发日期 在识别护照是空 /// </summary> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] public string signdate; /// <summary> /// 有效期 /// </summary> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] public string validterm; /// <summary> /// 证件编码 在识别护照时为护照号 识别港澳通行证内页时为港澳证件号码 /// </summary> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 40)] public string number; /// <summary> /// 备用 在识别护照时导出护照类型,识别港澳通行证封页时证件号 /// </summary> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public string other; /// <summary> /// 护照 台胞证,第一行机读码, /// 一代身份证时,复印件标记 /// </summary> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string szCodeOne; /// <summary> /// 护照 台胞证,第二行机读码 /// </summary> [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string szCodeTwo; }
然后 调用
IDCARD_ALL idCardAll = new IDCARD_ALL(); RecogNewIdcardOnlyALL(@"C:\scan9.BMP", ref idCardAll, true, 256, "scan9.BMP");
但是结果很悲剧 idCardAll 里面没数据。
这是为什么