遇到一个这样的DLL,原形如下。
int NewKey(char *room,char *gate,char *stime,char *guestname,char *guestid, int  overflag, long *cardno,char * track1,char * track2);
参数:
room [in]:房号,6字节字符串,必须是门锁系统设置的房号。
gate [in]:公共通道,字符串参数,“00”表示按默认授权通道,“99”表示授权所有公共通道,其他为指定通道代码。例如:“010203”表示授权01、02、03三个通道。
Stime [in]:起止时间,24字节字符串,格式yyyymmddhhnnyyyymmddhhnn,例如:“200012311230200101011230”表示2000年12月31日12时30分到2001年1月1日12时30分。Lock9200:起止时间不能在同一天内,且不能超过1个月。
Guestname [in]:客人姓名,最大30字节,可以为NULL。
Guestid [in]:客人ID,最大30字节,可以为NULL。
Overfla [in]:整形,是否覆盖当前卡上的内容。1-覆盖,当前卡不是新卡则自动注销(必须是客人卡)。0-不覆盖,不是新卡则返回。磁卡(手动发行机)忽略此参数,直接覆盖,不自动注销。
Cardno [out]:长整形指针,接收卡号(发卡后分配的唯一卡代码)。可以为NULL。
track1 [in]:字符串指针,磁卡第1轨数据,如不写此轨可为NULL。
track2 [in]:字符串指针,磁卡第2轨数据,如不写此轨可为NULL。不知道在C#中该如何声明。补充:我声明如下private static extern int NewKey(byte[] room, byte[] gate, byte[] stime, byte[] guestname, byte[] guestid, int overflag, ref int cardno, byte[] track1, byte[] track2);
在调用时 iResult = NewKey(Encoding.Default.GetBytes(rno), Encoding.Default.GetBytes("00"), Encoding.Default.GetBytes(stime), null, null, _LockData.ReCover ? 1 : 0,ref cardno, null, null);
这样调用会出异常 “尝试读取或写入受保护的内存,这能常指示其他内存已损坏”