delphi调用vc编写的dll文件

delphi_wo 2011-05-31 05:05:43
DLL文件函数说明:
VerifyPublicKey(char * RandomM , char *DataOut)
输入函数:
RandomM:主站随机数(8个字节)
输出函数:
DataOut :签名(126个字节)

在Delphi中调用,
type
Buffer1=Array[0..15] of char;
Ptr1=^Buffer1;
Buffer2=Array[0..255] of char;
Ptr2=^Buffer2;
...
end;

function VerifyPublicKey(RandomM:Ptr1;DataOut:Ptr2):integer;stdcall;External'AA.dll';

procedure TForm1.Button1Click(Sender: TObject);
var Flag:integer;
RStr:Ptr1;
DStr:Ptr2;
str:string;
begin
str:='1234567891234567';//随机数
RStr:=@str;
Flag:=VerifyPublicKey(RStr,DStr);
if Flag=1 then
begin
Application.MessageBox('成功!','系统提示',mb_ok);
Memo1.Lines.Add(DStr^);//显示返回的内容
end
else
begin
Application.MessageBox('失败!','系统提示',mb_ok);
end;
end;

到执行那个函数时报错(就这句:Flag:=VerifyPublicKey(RStr,DStr);),提示“Access violation at address 1000371E in module 'AA.dll', Write of address 00000000.”,请大家帮我看看,是不是定义的指针类型有问题,或者是赋值有问题,(注:VC写的Dll文件是没问题的,Dll中的函数参数格式也没问题,但没有源码)谢谢!
...全文
88 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
delphi_wo 2011-06-01
  • 打赏
  • 举报
回复
问题解决了。
type
Ptr1=PChar;
Buffer2=Array[0..255] of char;
Ptr2=^Buffer2;
...
end;

function VerifyPublicKey(RandomM:Ptr1;DataOut:Ptr2):integer;stdcall;External'AA.dll';

procedure TForm1.Button1Click(Sender: TObject);
var Flag:integer;
RStr:Ptr1;
DStr:Ptr2;
str:string;
begin
str:='1234567891234567';//随机数
RStr:=PChar(str);
New(DStr);
Flag:=VerifyPublicKey(RStr,DStr);
if Flag=1 then
begin
Application.MessageBox('成功!','系统提示',mb_ok);
Memo1.Lines.Add(DStr^);//显示返回的内容
end
else
begin
Application.MessageBox('失败!','系统提示',mb_ok);
end;
Dispose(DStr);
end;

谢谢各位!
delphi_wo 2011-05-31
  • 打赏
  • 举报
回复
to:Jonix
需要分配吗?如何分呢?
delphi_wo 2011-05-31
  • 打赏
  • 举报
回复
function VerifyPublicKey(RandomM:PChar;DataOut:PChar):integer;stdcall;External'AA.dll';

procedure TForm1.Button1Click(Sender: TObject);
var Flag:integer;
RStr:PChar;
DStr:PChar;
str:string;
begin
str:='1234567891234567';//随机数
RStr:=PChar(str);
Flag:=VerifyPublicKey(RStr,DStr);
if Flag=1 then
begin
Application.MessageBox('成功!','系统提示',mb_ok);
Memo1.Lines.Add(DStr^);//显示返回的内容
end
else
begin
Application.MessageBox('失败!','系统提示',mb_ok);
end;
end;

还是不行,RStr:=PChar(str);这种赋值方法没问题吧?

Jonix 2011-05-31
  • 打赏
  • 举报
回复
估计是参数的内存没有分配所致
bdmh 2011-05-31
  • 打赏
  • 举报
回复
用pchar传递

5,379

社区成员

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

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