求助。调用C++动态库指针访问出错。

xtsygiu 2009-09-21 11:05:28

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
这句老是提示非法访问内存。

...全文
194 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xtsygiu 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hexpate 的回复:]
C++里面的指针在delphi里确实是可以用P系列的,但是你再加上Var就不对了,因为var表示的本身就传地址模式,所以没必要在用P系列的声明
[/Quote]

不好意思,我这还遇到一个问题,能否请教一下?
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这个变量存值的问题?还是?
xtsygiu 2009-09-22
  • 打赏
  • 举报
回复
嗯。谢谢。
wintergoes 2009-09-21
  • 打赏
  • 举报
回复
Gold_Readcard应该是他输出的有问题吧
xtsygiu 2009-09-21
  • 打赏
  • 举报
回复
我的就是那样做的啊。可是不行。
kampan 2009-09-21
  • 打赏
  • 举报
回复
var I: Integer;

I := vlql^;
xtsygiu 2009-09-21
  • 打赏
  • 举报
回复
分不够,可再加。在线等。谢谢各位。
Hexpate 2009-09-21
  • 打赏
  • 举报
回复
C++里面的指针在delphi里确实是可以用P系列的,但是你再加上Var就不对了,因为var表示的本身就传地址模式,所以没必要在用P系列的声明
xtsygiu 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hexpate 的回复:]
转成delphi的声明不正确, 请按下面的格式写入,如果再出错,请贴出你的调用代码极其相关变量:
function Read(intcom:SmallInt;baud:Integer;var vskh:Byte;
  var vlql:integer;var vics:SmallInt; var viklx:SmallInt; serror:PChar):integer;stdcall;

[/Quote]

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

Hexpate 2009-09-21
  • 打赏
  • 举报
回复
转成delphi的声明不正确, 请按下面的格式写入,如果再出错,请贴出你的调用代码极其相关变量:
function Read(intcom:SmallInt;baud:Integer;var vskh:Byte;
var vlql:integer;var vics:SmallInt; var viklx:SmallInt; serror:PChar):integer;stdcall;
xtsygiu 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wintergoes 的回复:]
Gold_Readcard应该是他输出的有问题吧
[/Quote]
Gold_Readcard这个函数名应该是read.我忘改了。
谢谢
xtsygiu 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 preserve 的回复:]
unsigned char *vskh
对应的delphi声明是
vskh:PByte
前面不要再加var了
后面的声明等都有如此错误。
[/Quote]
不加var那么函数都执行不成功,同样是内存该问出错。数据类型应该都匹配额了的啊。谢谢
preserve 2009-09-21
  • 打赏
  • 举报
回复
unsigned char *vskh
对应的delphi声明是
vskh:PByte
前面不要再加var了
后面的声明等都有如此错误。

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧