首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#调用C++ dll时,构造体参数类型的转换

2012-08-07 
C#调用C++ dll时,结构体参数类型的转换C++ 接口如下:int _stdcall TA_HazyInqAcc(AccountMsg *pAccMsg, in

C#调用C++ dll时,结构体参数类型的转换
C++ 接口如下:
int _stdcall TA_HazyInqAcc(AccountMsg *pAccMsg, int *RecNum , char *FileName,short TimeOut = 10);
结构体如下:
typedef struct
{
  char Name[21]; /*姓名*/
  char SexNo[2]; /*性别*/
  char DeptCode[19]; /*部门代码*/
  unsigned int CardNo; /*卡号*/
  unsigned int AccountNo; /*帐号*/
  char StudentCode[21]; /*学号*/
  char IDCard[21]; /*身份证号*/
  char PID[3]; /*身份代码*/
  char IDNo[13]; /*身份序号*/
  int Balance; /*现余额*/
  char Password[7]; /*消费密码*/
  char ExpireDate[7]; /*账户截止日期*/
  unsigned short SubSeq; /*补助戳*/
  char IsOpenInSys; /*是否在本系统内开通*/
  short TerminalNo; /*终端号码,提取补助时需要填写*/
  short RetCode; /*后台处理返回值*/
  char Flag[16]; /*状态(2004-08-26增加)*/
  char CardType[4]; /*卡类型*/
  char AccType[4];  
  unsigned short UsedCardNum; /*卡片上的用卡次数*/
  long AccAmt;  
  char Pad[70]; /*预留字段*/
} AccountMsg;

我现在这样调用的
[DllImport("AIO_API.dll")]
public static extern int TA_HazyInqAcc(ref read AccMsg, ref int RecNum, byte[] FileName, short TimeOut = 10);

C#定义的结构体
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
  public struct AccountMsg 
  {
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 21)]
  public string Name;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 2)]
  public string SexNo;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 19)]
  public string DeptCode;
  public UInt32 CardNo;
  public UInt32 AccountNo;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 21)]
  public string StudentCode;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 21)]
  public string IDCard;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 3)]
  public string PID;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 13)]
  public string IDNo;
  public int Balance;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 7)]
  public string Password;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 7)]
  public string ExpireDate;
  public UInt16 SubSeq;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 1)]
  public char IsOpenInSys;
  public short TerminalNo;
  public short RetCode;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 16)]
  public string Flag;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 4)]


  public string CardType;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 4)]
  public string AccType;
  public UInt16 UsedCardNum;
  public Int32 AccAmt;
  [MarshalAs(UnmanagedType.AnsiBStr, SizeConst = 70)]
  public string Pad;
  };

函数调用如下:
AccountMsg pacc = new AccountMsg();
int recNum = 0;
byte[] filename = new byte[210];
int ret = TA_HazyInqAcc(ref pacc,ref recNum, filename);

错误:无法加载 DLL“AIO_API.dll”: 找不到指定的模块。

请高手指教

[解决办法]
j结构体参数
如果你的C++结构体里面包含联合体,需要使用Explict选项,
TCHAR字符串成员的话,需要考虑ANSI和Unicode DLL的情形。
考虑下C#结构体内存布局 Auto,Explicit,Sequential的。。
总之结构体在C++与C#之间互掉很麻烦的,。。
我记得有个啥工具。。可以帮助生成代码。。你找找



热点排行