求解一个比较的难题!

samfeng_2003 2006-06-29 10:54:40
我在开发一个考勤机的接口程序!因为动态连接库是用dephi开发的,我不太想用dephi开发所以就用c#在写它的程序,但是现在遇到一个问题!

比如在动态库EastRiver的库里有两个这样的函数


第一个
ReadClockRecordTotal: 读设备已经存储的记录数

语法:
function ReadClockRecordTotal(hPort: THandle; var data: Integer): Boolean;

参数说明:
hPort: 端口句柄, 调用OpenCommPort函数得到,需要联机
data: 返回记录数量

返回变量: 如果返回True表示成功,如果返回False表示失败。

第二个
ReadStandardRecord: 读所有刷卡记录

语法:
function ReadStandardRecord(hPort: THandle; Data: PChar; timeString: PChar; var mark: Char;
var flag: Integer; var cardTimes: Integer; var cardGroup: Integer): Boolean;

参数说明:
hPort: 端口句柄, 调用OpenCommPort函数得到,需要联机
data: 读回的卡号字符串, 缓冲区需大於20字节长度
timeString: 读回的14位刷卡时间字符串, 格式为yyyymmddhhmmss, 缓冲区需大於20字节长度
mark: 读卡机标识字符.
flag: 存储卡的结果, 对应二进制数各位的意义如下: flag = 0 : 表示为正常卡 flag.0 = 1 : 表示为非法门禁卡 flag.1 = 1 : 表示为非法考勤卡 flag.2 = 1 : 表示为黑名单卡
cardTimes: 发卡次数, 0-15
cardGroup: 卡的组别, 0-255

返回变量: 如果返回False表示当前记录读取失败,如果返回True表示成功

然后我在C#的项目里面做了个EastRiver类,然后用
[DllImport("EastRiver.dll")] public static extern bool ReadStandardRecord(int hPort,ref string Data,ref string timeString,ref string mark,ref int flag,ref int cardTimes,ref int cardGroup);//读刷卡记录(^2G)

[DllImport("EastRiver.dll")] public static extern bool ReadClockRecordTotal(int hPort,ref int data);//读设备已经存储的考勤记录数

连对接动态库,但是我在程序里用

string data="";
string timeString="";
string mark="";
int flag=0;
int cardTimes=0;
int cardGroup=0;
if(EastRiver.ReadStandardRecord(hport,ref data,ref timeString,ref mark,ref flag,ref cardTimes,ref cardGroup))//提取考勤数据
{
string sql="insert into n_kqjlu(cardid,sjian,skjg) values('"+data.ToString()+"','"+timeString.ToString()+"','"+num.ToString()+"')";
SqlDataAdapter myDataAdapter= new SqlDataAdapter(sql,myConnection);
DataSet dt=new DataSet();
myDataAdapter.Fill(dt);
RefreshDataGrid(data.ToString(),num.ToString(),timeString.ToString(),flag);
}

的时候不能提取到正常的卡号,出现string类型的数据都为"",因此我想是不是dephi里面的pchar类型到C#里面的string类型,我是不是转错了!第一个函数就一点问题都没有!int转int就不会出现为空或者出错的情况!
...全文
198 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
samfeng_2003 2006-06-29
  • 打赏
  • 举报
回复
出现这样的错误!

未处理的“System.NullReferenceException”类型的异常出现在 kaoqin.exe 中。

其他信息: 未将对象引用设置到对象的实例。
samfeng_2003 2006-06-29
  • 打赏
  • 举报
回复
好的!谢谢,我试试!
samfeng_2003 2006-06-29
  • 打赏
  • 举报
回复
就是Muf(沐枫) ,我不太明白,能不能给个例子呢?
Muf 2006-06-29
  • 打赏
  • 举报
回复
[DllImport("EastRiver.dll", CharSet=CharSet.Ansi)]
public static extern bool ReadStandardRecord(
int hPort,
[MarshalAs(UnmanagedType.LPStr)]
ref string Data,
[MarshalAs(UnmanagedType.LPStr)]
ref string timeString,
ref char mark,
ref int flag,
ref int cardTimes,
ref int cardGroup
);
Muf 2006-06-29
  • 打赏
  • 举报
回复
1。string需分配足够的存储空间
2。需声明字串是Ansi还是Unicode。默认是Unicode。
diandian82 2006-06-29
  • 打赏
  • 举报
回复
不懂,使用指针试试
samfeng_2003 2006-06-29
  • 打赏
  • 举报
回复
有经验的高手帮帮忙!先多谢了!
ilove8 2006-06-29
  • 打赏
  • 举报
回复
up
samfeng_2003 2006-06-29
  • 打赏
  • 举报
回复
问题很古怪,我用dephi就可以接到卡号,但是C#就为空为什么啊!而且有的返回为pchar的,我用string类型的参数做进去就要出错!这是为什么呢?

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧