是这样的情况:录入学生姓名的同时需要将学生姓名和考勤机的卡号写入考勤机中去,考勤机厂商给了一个调用接口函数的dll,比如插入记录的函数CFInsertCard ();厂家给我的函数定义如下
INTEGER CFInsertCard(LONG HCF,INTEGER DeviceID,INTEGER No,LONG ID,STRING * Name)。
功能说明: 增加(修改)一张卡片资料。
参数说明:LONG  HCF       设备标识号(由CFCreateDevice()函数返回得到)。 
         INTEGER     DeviceID  设备ID号,范围为1~99。
         INTEGER    No        卡片流水编号,取值范围为1~5000;
         LONG   ID             ID卡的卡片内码序号。
         INTEGER  *  Name      姓名,最长为4个汉字(注意:空格符号请输入国标码的空格符号)。
返回值: 
0       设置成功。
1 设置失败。  
2 参数不符合取值范围。请教各位的是STRING * Name是在C++中是字符串指针吧,在DELPHI中如何将姓名字符串转换成字符串指针呢?请指教,不甚感激
还有如果输入的姓名不满4个字时候,"空格符号请输入国标码的空格符号",DELPHI中应该怎么处理呢?谢谢

解决方案 »

  1.   

    给出个静态调用的例子,你试试。
    //======
    interface
     CFInsertCard: function(HCF: LongInt; 
                             DeviceID: INTEGER; 
                             No: INTEGER; 
                             ID: LongInt; 
                             var Name: STRING): INTEGER  stdcall;
    //=======
    implementationfunction CFInsertCard; external 'XXXXXXX.DLL';
      

  2.   

    关于第2个问题:
    先得到姓名的长度,用Length();
    差几个就用' '补为8个字节;
      

  3.   

    谢谢whaway(湘北清翔) 
    我的代码是这样的,可以吗?
    procedure LoadDLL;
    var
      hDll: THandle;
    begin
      hDll := LoadLibrary('CF898.dll');
      if hdll < 32 then begin
        Showmessage('加载DLL出错!');
        exit;
      end else
      begin
        @CFCreateDevice := GetProcAddress(hDll, 'CFCreateDevice');
        @CFCloseDevice := GetProcAddress(hDll, 'CFCloseDevice');
        @CFInsertCard := GetProcAddress(hDll, 'CFInsertCard');
        @CFDeleteCard := GetProcAddress(hDll, 'CFDeleteCard ');
      end;
    end;
    执行插入操作的时候
    begin  
         loaddll;
          ret := CFCreateDevice(i);
          if ret = 0 then 
          begin
           abort;
          end;
          if ret <> 0 then
          begin
              CFInsertCard(i, 01, 01, id, name);
          end;
    end;
      

  4.   

    keep my eyes here ,以前有做过,好象是用字符数组取的。
      

  5.   

    1、将函数CFInsertCard翻译成Delphi的函数说明:
    INTEGER CFInsertCard(LONG HCF,INTEGER DeviceID,INTEGER No,LONG ID,STRING * Name)。Function CFInsterCard(HCF:     LongInt; 
                         DeviceID: Integer ;
                         No:       Integer;
                         ID:       LongInt
                         Name:     PChar):Integer;Cdel;2、INTEGER*  Name 可能与PChar对应(不能确定)  
       Name的对应参数要说明为 NameStr: Array[0..7] Of Char;3、调用:CFInsterCard(HCF,DeviceID,No,ID,@NameStr)
        
    4、参考回贴:
       http://expert.csdn.net/Expert/topic/2237/2237804.xml?temp=.23164
      

  6.   

    INTEGER CFInsertCard(LONG HCF,INTEGER DeviceID,INTEGER No,LONG ID,STRING * Name)。Function CFInsterCard(HCF:     LongInt; DeviceID: Integer ;No:       Integer;
                         ID:       LongInt; Name:     PChar):Integer;stdcall;external youdll name 'CFInsterCard'
    string * name 在C里面就是字符串指针,所以Delphi里声明成pchar。
      

  7.   

    谢谢各位
    我调用厂家给DLL,只能动态调用吧,没有LIB文件可以静态调用吗?
      

  8.   

    指针不是可以用integer来替换吗?
      

  9.   

    我就是不清楚字符串型的名称在调用插入函数的时候变成PCHAR格式插入
    请高手指点
      

  10.   

    STRING * Name 是个指针类型,在Delphi中相应的也应该传递一个指针,所以用pchar
      

  11.   

    str:='栈';str[1],str[2]返回的就是'栈' 的国标码
      

  12.   

    靠  c++中有string类型吗
    恕我孤陋寡闻
    不过还是查查string到底是什么类型吧
    一般,c++ c 中的字符串是用字符指针操作的:char * name;
    在delphi中,pchar类型就是c++ c类型的字符指针 他们完全一样的
      

  13.   

    多谢各位,我再试试,
    现在奇怪的是我在调试程序的时候发现
    var
      names: string;
      NameStr:Array[0..7] Of Char;
      id:integer;
    begin
    StrPCopy(namestr, 'nihaoa');
    showmessage(inttostr(CFInsertCard(1,1,1,1234567890,namestr)));
    end;
    程序运行后,发现返回的值是1808881154
    而厂家定义的函数的返回值只有0,1,2三种
    请问这是什么原因啊,谢谢!
      

  14.   

    大家也可以从这个地方下源代码看看,存在什么问题,谢谢各位
    http://www.bluejacky.com/download/cftest.rar
      

  15.   

    showmessage(inttostr(CFInsertCard(1,1,1,1234567890,@namestr)));
      

  16.   

    String类型不明确
    或许是bcb写的dll,试试showmessage(inttostr(CFInsertCard(1,1,1,1234567890,@namestr)));
      

  17.   

    我把showmessage(inttostr(CFInsertCard(1,1,1,1234567890,namestr)));
    改成showmessage(inttostr(CFInsertCard(1,1,1,1234567890,@namestr)));后
    返回值仍然是1808881154
    这是咋回事啊
      

  18.   

    由CFCreateDevice产生 HCF  ,不要随手写
      

  19.   

    应该不是string的问题
    因为并没有传入string类型的参数
      

  20.   

    厂家给的函数原型INTEGER CFInsertCard(LONG HCF,INTEGER DeviceID,INTEGER No,LONG ID,STRING * Name)。只是一个伪码,没有必要争论STRING *,这就是一个char *,你返回不正确是因为改函数是c写的函数后要加上“Cdel”
    正如 Seahilly(小峰) ( ) 写的:Function CFInsterCard(HCF:     LongInt; 
                         DeviceID: Integer ;
                         No:       Integer;
                         ID:       LongInt
                         Name:     PChar):Integer;Cdel;
    我下你的包来看了一下,改后,我直接掉CFInsterCard返回为1,只不过函数完成后会报错。
    是不是先要初始化什么的。我提醒一句,这个dll是共享mfc的dll,如果仍然出问题,你还是自己联系一下厂商。
      

  21.   

    有C的头文件说明么?
    我的意思是DLL有C语言调用的源程序例子么?
    有就好办多了。
      

  22.   

    还有,
    Pchar 好像只能和void *划等号的吧。
      

  23.   

    to jiju(UNCC) :谢谢,我按你的方法试了一下的确是这样,CDECL主要起什么作用?
    to whaway(湘北清翔): 没有例子程序啊,厂家就给了个DLL和函数说明
    感谢各位的帮助,我快要结贴了
    这问题我在C/C++里也贴了,各位可以去下面的帖子UP一下,我会把分分给各位的,谢谢
    http://expert.csdn.net/Expert/topic/2871/2871813.xml?temp=.2039301
      

  24.   

    那个STRING是定义的是什么那?
    typedef std::string STRING ?
    typedef char STRING ?
    typedef char* STRING ?
    typedef w_tchar STRING ?
    还是
    typedef w_tchar* STRING ?
      

  25.   

    string 是标准 C++ 中的类指针来的,不是字符串指针
      

  26.   

    看错了 不过这也是看中国人写的说明书之痛苦了
    我原来看英文的说明书觉得很不爽的前一段时间看了深圳和山东的两家公司的说明书后
    就觉得看英文说明是非常简单的,一就是一,说得非常清楚
    而且很多都是有例子的不过针对你现在的函数,
    我猜 99.9999% 是这样的
    int iName[8];
    char *pName = iName; 
    ZeroMemory(iName, sizeof(int)*8);
    iName[0]=3326; //梁 字,我的姓
    iName[1]=XXXX; 
    iName[2]=XXXX; 
    iName[3]=XXXX; CFInsertCard(...,pName);
    声明为 pchar 即可
    不过这些函数确实是 cdecl 方式调用的
      

  27.   

    搞错了
    iName[0]=0x3326; //梁 字,我的姓