导航
  • 主页
  • WinForm
  • WPF
  • 问答

C#调用包含结构体变量函数的vc++的dll出现问题

山娃马小三儿 2010-01-17 02:00:25
dll函数原型:

结构体声明
typedef struct tagIDCardData{
char Name[32]; //姓名
char Sex[4]; //性别
char Nation[6]; //名族
char Born[18]; //出生日期
char Address[72]; //住址
char IDCardNo[38]; //身份证号
char GrantDept[32]; //发证机关
char UserLifeBegin[18]; //有效开始日期
char UserLifeEnd[18]; //有效截止日期
char reserved[38]; //保留
char PhotoFileName[255]; //照片路径
}IDCardData;

函数声明:
Syn_ReadMsg(int iPortID,int iIfOpen,IDCardData *pIDCardData);
说明: 读取证/卡信息
参数:iPort [in] 整数,表示端口号。参见7.1。
iIfOpen [in] 整数,参见7.2。
pIDCardData [out] IDCardData类型读出的数据

在C#中的结构体声明如下
public struct CardData
{
public byte[] Name;
public byte[] Sex;
public byte[] Nation;
public byte[] Born;
public byte[] Address;
public byte[] IDCardNo;
public byte[] GrantDept;
public byte[] UserLifeBegin;
public byte[] UserLifeEnd;
public byte[] reserved;
public byte[] PhotoFileName;
};
调用:
CardData tCardData = new CardData();
tCardData.Name = new byte[32];
tCardData.Sex = new byte[4];
tCardData.Nation = new byte[6];
tCardData.Born = new byte[18];
tCardData.Address = new byte[72];
tCardData.IDCardNo = new byte[38];
tCardData.GrantDept = new byte[32];
tCardData.UserLifeBegin = new byte[18];
tCardData.UserLifeEnd = new byte[18];
tCardData.reserved = new byte[38];
tCardData.PhotoFileName = new byte[255];

int i = -1;
i = Syn_ReadMsg(iPortID, iIfOpen, out tCardData);
报错:Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
...全文
130 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
风龙-3 2010-01-18
增加属性[StructLayout(LayoutKind.Sequential)];

public byte[] Name
可改为
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string Name
试试看
回复
帮忙,帮忙,帮忙
回复
大家帮帮忙 啊
回复
最怵头的就是指针,能不能详细点啊
回复
csrwgs 2010-01-17
i = Syn_ReadMsg(iPortID, iIfOpen, out tCardData);

把out改成ref试试

再不行就转成指针
回复
求帮助
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.