好久没有来了,打搅一下!:)
我在开发一个考勤机的接口程序!因为动态连接库是用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 : Char;
var flag: Integer; var cardTimes: Integer; var cardGroup: Integer): Boolean; 参数说明:
hPort: 端口句柄, 调用OpenCommPort函数得到,需要联机
data: 读回的卡号字符串, 缓冲区需大於20字节长度
timeString: 读回的14位刷卡时间字符串, 格式为yyyymmddhhmmss, 缓冲区需大於20字节长度
: 读卡机标识字符.
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 ,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 ="";
int flag=0;
int cardTimes=0;
int cardGroup=0;
if(EastRiver.ReadStandardRecord(hport,ref data,ref timeString,ref ,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就不会出现为空或者出错的情况!
我在开发一个考勤机的接口程序!因为动态连接库是用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 : Char;
var flag: Integer; var cardTimes: Integer; var cardGroup: Integer): Boolean; 参数说明:
hPort: 端口句柄, 调用OpenCommPort函数得到,需要联机
data: 读回的卡号字符串, 缓冲区需大於20字节长度
timeString: 读回的14位刷卡时间字符串, 格式为yyyymmddhhmmss, 缓冲区需大於20字节长度
: 读卡机标识字符.
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 ,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 ="";
int flag=0;
int cardTimes=0;
int cardGroup=0;
if(EastRiver.ReadStandardRecord(hport,ref data,ref timeString,ref ,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就不会出现为空或者出错的情况!
--〉
dim data string(50)
--〉
string data="0000000000000000000000000000000000000000";
55555555555555!只写了一天dephi,确实好多不懂!procedure Tform1.lvClockID_Show();
var
i: Integer;
begin
Form1.lvClocks.Items.BeginUpdate;
try
Form1.ADOQuery1.Close;
Form1.ADOQuery1.SQL.Text := 'select * from decive';
Form1.ADOQuery1.Open;
Form1.lvClocks.Items.Clear;
for i := 0 to Form1.ADOQuery1.RecordCount-1 do
begin
with lvClocks.Items.Add do
begin
Caption := (ADOQuery1.FieldByName('d_id').AsString);
SubItems.Add(ADOQuery1.FieldByName('Decive_name').AsString);
SubItems.Add(ADOQuery1.FieldByName('port_name').AsString);
SubItems.Add(ADOQuery1.FieldByName('port_speed').AsString);
SubItems.Add(ADOQuery1.FieldByName('Decive_type').AsString)
end;
Form1.ADOQuery1.Next;
end;
finally
lvClocks.Items.EndUpdate;
end;
end;就是listview控件我用了五列
0 索引号 (设定宽度为1)
1 机号
2 通信端口
3 通信速率
4 设备类型但是我这样写
SubItems.Add(ADOQuery1.FieldByName('d_id').AsString
SubItems.Add(ADOQuery1.FieldByName('Decive_name').AsString);
SubItems.Add(ADOQuery1.FieldByName('port_name').AsString);
SubItems.Add(ADOQuery1.FieldByName('port_speed').AsString);
SubItems.Add(ADOQuery1.FieldByName('Decive_type').AsString)
就
不能对应合适,为什么啊!