好久没有来了,打搅一下!:)
我在开发一个考勤机的接口程序!因为动态连接库是用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就不会出现为空或者出错的情况!

解决方案 »

  1.   

    [DllImport("EastRiver.dll")] public static extern bool ReadStandardRecord(int hPort,out string Data,out string timeString,out string ,out int flag,out int cardTimes,out int cardGroup);[DllImport("EastRiver.dll")] public static extern bool ReadClockRecordTotal(int hPort,out int data);
      

  2.   

    问题可能在你必须在读取前分配空间,不知道c#怎么分配的vb用法:string data="";            
    --〉
    dim data string(50)
      

  3.   

    可能这样可以string data="";            
    --〉
    string data="0000000000000000000000000000000000000000";
      

  4.   

    我现在在用dephi在写,但是我在用listview组件的时候遇到个问题!不好意思,就连带请大家解决.
    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)

    不能对应合适,为什么啊! 
      

  5.   

    因为这些是创建ListItem的子列啊,
      

  6.   

    与数据库是无关,关于C#的问题,可能是非托管声明出了问题,至于DELPHI这个问题,如我上所说。
      

  7.   

    呵呵!最近用DEPHI写了一下,看了一下例子,终于明白了,因为制定了一个record的Flist,所以很多类型没有接对!用dephi就好写了!