c++声明 
extern "C" __declspec(dllexport)  long __stdcall Read(__int16 intcom,int baud,unsigned char *vskh,int *vlql,__int16 *vics,__int16 *viklx,char *error);  delphi声明: 
function Read 
(intcom:SmallInt;baud:Integer;var vskh:PByte;var vlql:pinteger;var vics:pinteger; var viklx:pinteger;var vserror:PChar):integer;stdcall; 调用代码: 
procedure TForm1.Button4Click(Sender: TObject); 
var 
i:integer; 
err:pchar; 
pb:PByte; 
vlql:pinteger; 
vics,viklx:pSmallInt; 
vlq,vic,vikl:integer; 
s:string; 
begin 
   err := StrAlloc(256);    GetMem(vlql, 3*SizeOf(Integer)); 
   GetMem(vics, 3*SizeOf(SmallInt)); 
   GetMem(viklx, 3*SizeOf(SmallInt));    i:=Gold_Readcard(0,9600,pb,vlql,vics,viklx,err);    if i=0 then 
   begin 
      vlq:=vlql^; 
    s:='OK,' + inttostr(vlq); 
    ShowMessage(PChar(s)); 
   end; 错误: 
vlq:=vlql^;  
vlql返回值:$64 
这句老是提示非法访问内存。 
 

解决方案 »

  1.   

    var I: Integer;I := vlql^; 
      

  2.   

    Gold_Readcard应该是他输出的有问题吧
      

  3.   

    unsigned char *vskh
    对应的delphi声明是
    vskh:PByte
    前面不要再加var了 
    后面的声明等都有如此错误。
      

  4.   

    不加var那么函数都执行不成功,同样是内存该问出错。数据类型应该都匹配额了的啊。谢谢
      

  5.   

    Gold_Readcard这个函数名应该是read.我忘改了。
    谢谢
      

  6.   

    转成delphi的声明不正确, 请按下面的格式写入,如果再出错,请贴出你的调用代码极其相关变量: 
    function Read(intcom:SmallInt;baud:Integer;var vskh:Byte;
      var vlql:integer;var vics:SmallInt; var viklx:SmallInt; serror:PChar):integer;stdcall; 
      

  7.   


    谢谢 hexpate 这样确实读出来了。
    C++里不是用了指针吗?这里为什么不用指针呢?(能说明一下吗?谢谢)
    我马上给分。
      

  8.   

    C++里面的指针在delphi里确实是可以用P系列的,但是你再加上Var就不对了,因为var表示的本身就传地址模式,所以没必要在用P系列的声明
      

  9.   


    不好意思,我这还遇到一个问题,能否请教一下?
    extern "C" __declspec(dllexport)  long __stdcall Gold_Writecard(__int16 intcom,int baud,unsigned char *vskh,int vlql,__int16 vics,__int16 viklx,char *error);
    delphi声明:
    function Writecard
    (intcom:SmallInt;baud:Integer;vskh:pbyte;vlql:Integer;vics:SmallInt;viklx:SmallInt;vserror:PChar):integer
    调用:
    procedure TForm1.Button3Click(Sender: TObject);
    var
    i:integer;
    pb:pbyte;
    err,temp:pchar;
    str:string;
    begin
    str:='2';
    temp:=PChar(str);pb:=pbyte(temp);
    err := StrAlloc(256);i:=Gold_Writecard(0,9600,pb,100,1,1,err);
    ShowMessage(IntToStr(i));
    end;我这是操作IC卡的函数。用这个函数写入的内容,用上面那个函数读出来的数据不一样。
    我不知道是因为这个byte这个变量存值的问题?还是?