一个VC写的dll中的函数,声明如下:
  WORD SLE4442_ReadPWD(
BYTE *_bPWD
);
参数
_bPWD 
字符型指针,指向从卡片内读到的密码并返回给应用程序。在HEXADECIMAL模式下,应用程序应确保在调用此函数前,已分配给_bPWD指针至少3个字节的空间;在ASCIISTRING模式下,应确保已分配给_bPWD指针至少6个字节的空间。   WORD MCS_SetStringMode(
BYTE _bStringMode,
);
 
参数
_bStringMode 
设置随后操作的字符串传递方式: 常量 值 含义 
HEXADECIMAL 0 16进制字符串 
ASCIISTRING 1 ASCII字符串 
我的程序:function MCS_SetStringMode(_StringMode: BYTE): WORD;
  stdcall; external 'MCS_SR.DLL';function SLE4442_ReadPWD( _bPWD:PChar): WORD;
  stdcall; external 'MCS_SR.DLL';procedure TForm1.Button5Click(Sender: TObject);
var
 Pass:pchar;
 S:string;
begin
  Pass:=StrAlloc(4*sizeof(Char));  case MCS_SetStringMode(0) of
    0: Showmessage('设置成功!');
    else  Showmessage('设置失败!');
  end;  case SLE4442_ReadPWD(Pass) of
    0:  begin
          Showmessage('密码读取成功!');
          S:=Pass;
          StrDispose(Pass);
          Label1.Caption:=S;
        end;
    else Showmessage('密码读取失败!');
  end;
end;程序运行后函数都能返回0,说明调用成功,但读出来的密码是'',请高手指教,万分感谢!

解决方案 »

  1.   

    function SLE4442_ReadPWD( _bPWD:PChar): WORD
    应该是function SLE4442_ReadPWD(var _bPWD:PChar): WORD
    这样才能把_bPWD的值带出来
      

  2.   

    不对,PChar是指向Char的指针,利用指针传递参数是不需要加Var指示字,问题出在PChar的类型不可以直接赋值给String类型,而String类型通过强制类型转换却可以赋值给PChar类型。因此上述代码应改成下列方式:
    procedure TForm1.Button5Click(Sender: TObject);
    var
     Pass:pchar;
     S:string;
    begin
      Pass:=StrAlloc(4*sizeof(Char));
      SetLength(S, 4);  case MCS_SetStringMode(0) of
        0: Showmessage('设置成功!');
        else  Showmessage('设置失败!');
      end;  case SLE4442_ReadPWD(Pass) of
        0:  begin
              Showmessage('密码读取成功!');
              Move(Pass^, S[1], 4); 
              StrDispose(Pass);
              Label1.Caption:=S;
            end;
        else Showmessage('密码读取失败!');
      end;
    end;
      

  3.   

    试了hexenzhou(甲骨文)的方法,可读出来还是空的。
      

  4.   

    应该是function SLE4442_ReadPWD(var _bPWD:^Byte): WORD
      

  5.   

    先谢谢楼上的回复,不过这样定义会报错:
    [Error] Unit1.pas(52): Identifier expected but '^' found
    还请多帮帮忙,分不够可再加。
      

  6.   

    type p=^byte;
    function SLE4442_ReadPWD(var _bPWD:p): WORD
    就没问题了
      

  7.   

    常量 值 含义 
    HEXADECIMAL 0 16进制字符串 
    ASCIISTRING 1 ASCII字符串 
     case MCS_SetStringMode(0) of
    是不是这里的问题?
      

  8.   

    你没有写这个SLE4442_ReadPWD的定义
    试试这两种
    case SLE4442_ReadPWD(@Pass) of
        0:  begin
              Showmessage('密码读取成功!');
              S:=Pass;
              StrDispose(Pass);
              Label1.Caption:=S;
            end;
        else Showmessage('密码读取失败!');
      end;
    把指针地址传入
    或者
    case SLE4442_ReadPWD(Pass^) of
    把指针所指向的内存地址传入
      

  9.   

    to: Focus(老鱼), 
    函数是这样定义吗?
    function SLE4442_ReadPWD( _bPWD:PChar): WORD;
      stdcall; external 'MCS_SR.DLL';原来的是这个:
    WORD SLE4442_ReadPWD(
    BYTE *_bPWD
    );to all: 请问'$30303030'是什么值(我调试的时候pass的值)
      

  10.   

    你用我说的第二种方法传入
    PASS的值是地址
    你调用时把实际的内存地址传入就是第二种方法了
    C的指针和PASCAL的指针有所不同
      

  11.   

    那我的函数
    function SLE4442_ReadPWD( _bPWD:PChar): WORD;
      stdcall; external 'MCS_SR.DLL';  _bPWD是定义成PChar,还是定义成指针,定义成指针应该怎样定义?麻烦了,多谢!请再帮帮忙,我想应该是可以用的.
    在VFP中都可以用,在DELPHI中也应该能用的.
      

  12.   

    一个VC写的dll中的函数,声明如下:
      WORD SLE4442_ReadPWD(
    BYTE *_bPWD
    );
    参数
    _bPWD 
    字符型指针,指向从卡片内读到的密码并返回给应用程序。在HEXADECIMAL模式下,应用程序应确保在调用此函数前,已分配给_bPWD指针至少3个字节的空间;在ASCIISTRING模式下,应确保已分配给_bPWD指针至少6个字节的空间。   WORD MCS_SetStringMode(
    BYTE _bStringMode,
    );
     
    参数
    _bStringMode 
    设置随后操作的字符串传递方式: 常量 值 含义 
    HEXADECIMAL 0 16进制字符串 
    ASCIISTRING 1 ASCII字符串 
    我的程序:
    type pbyte=^byte
    function MCS_SetStringMode(_StringMode: BYTE): WORD;
      cedcl; external 'MCS_SR.DLL';function SLE4442_ReadPWD( _bPWD:pbyte): WORD;
      cedcl; external 'MCS_SR.DLL';procedure TForm1.Button5Click(Sender: TObject);
    var
     Pass:pchar;
     S:string;
    begin
      Pass:=StrAlloc(4*sizeof(Char));  case MCS_SetStringMode(0) of
        0: Showmessage('设置成功!');
        else  Showmessage('设置失败!');
      end;  case SLE4442_ReadPWD(Pass) of
        0:  begin
              Showmessage('密码读取成功!');
              S:=Pass;
              StrDispose(Pass);
              Label1.Caption:=S;
            end;
        else Showmessage('密码读取失败!');
      end;
    end;