我用DELPHI改写了一个VB的函数调用,但总是报地址错,请高手帮帮忙!急,我在线等啊VC格式:       SCREADER_API BOOL WINAPI MF_CascSelect(long hPort,BYTE argSelectCode,BYTE* pSnr, BYTE* pSak);
    SCREADER_API BOOL WINAPI MF_Select(long hPort,BYTE* pSnr, BYTE* pSak);
VB语法:    Public Declare Function MF_CascSelect Lib "SCReader.dll" (ByVal hPort As Long, ByVal argSelectCode As Byte, pSnr As Byte, pSize As Byte) As Long
    Public Declare Function MF_Select Lib "SCReader.dll" (ByVal hPort As Long, pSnr As Byte, pSak As Byte) As Long
 参数:    hPort        [IN]读写器句柄,由SC_OpenReader返回得到。    argSelectCode   [IN]选择码,93H为标准的选择码,95H为一级码,97H为二级码。    pSnr                 [IN]4字节卡号,指定要选择的卡的卡号。    pSak                [OUT]1字节的响应信息,无特殊含义。  返回值:    非0值表示成功,0表示失败。 VB演示:Dim bRetval As Long
Dim sak As Byte
bRetval = MF_Select(m_hPort, m_snr(0), sak)
If 0 <> bRetval Then
    txtSAK.Text = ToHexString(sak)
Else
    MsgBox "Anticoll Failed!"
End If{******************以下我用DELPHI写的程序*****************************}申明:
  function MF_Select(hPort:integer;pSnr:array of byte;pSize:byte):integer;Stdcall;external 'SCReader.dll' name 'MF_Select';
procedure TForm1.Button6Click(Sender: TObject);   //select
var
  bRetval,i:integer;
  str_tmp:string;
  bt_tmp:byte;
begin
  try
    bRetval:=MF_Select(vpi_openport,arr_serialno,bt_tmp);//
  except
  end;
  If bRetval<>0 Then
  begin
    str_tmp:=inttohex(bt_tmp,2);
    memo1.Lines.Add('返回值:'+inttostr(bretval)+' 字节内容:'+str_tmp);
  end
  Else
  begin
    memo1.Lines.Add('MF_SELECT 出错!');
  End;
end;

解决方案 »

  1.   

    老兄,我看你这个是API调用吧,看来看去不明白,看看其它高手
      

  2.   

    function MF_Select(hPort:integer;pSnr:PChar;pSize:PChar):integer;Stdcall;external 'SCReader.dll' name 'MF_Select';
    另外对SCREADER_API BOOL WINAPI 这是什么东西我不太明白,反正如果'SCReader.dll是拿VC写的话这样调用应该没问题的。
    注意:pSnr:PChar;和pSize:PChar;这两个参数对应的指针的数据格式,比如原来要求10byte的内容,那传入的指针对应的也要10byte的内容。
      

  3.   

    function MF_Select(
        hPort:LongInt; 
        pSnr, pSize: Pointer
        ): Integer;Stdcall;external 'SCReader.dll' name 'MF_Select';
      

  4.   

    好啦,问题已经解决,多谢大家的关照,放分了!
    其实,是它的DLL库的要求特别严格,它要求:
    输入用 var申明;
    输出用 out申明;"另外对SCREADER_API BOOL WINAPI 这是什么东西我不太明白,"其实一开始就注明了这是VC调用函数的方式,不是吗?