Delphi7调用C++编写的dll提示AV错误

[复制链接]
查看11 | 回复3 | 2021-1-27 05:09:37 | 显示全部楼层 |阅读模式
unitUnit1;
interface
uses
Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,
StdCtrls;
type
TForm1=class(TForm)
Button1:TButton;
Edit1:TEdit;
Edit2:TEdit;
Edit3:TEdit;
Label1:TLabel;
Label2:TLabel;
procedureButton1Click(Sender:TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;
functionAdd(a:Integer;b:Integer):Integer;stdcall;external'Dll1.dll';
var
Form1:TForm1;
implementation
{$R*.dfm}
procedureTForm1.Button1Click(Sender:TObject);
begin
Edit1.Text:=IntToStr(Add(3,6));//这样就失败为什么?
//Edit3.Text:=IntToStr(Add(StrToInt(Edit1.Text),StrToInt(Edit2.Text)));//这样就成功
end;
end.

代码如上图
就是简单的加法,不知道为什么第一种写法就出错,第二种就没事儿,请大佬解释下,谢谢
//pch.h:这是预编译标头文件。
//下方列出的文件仅编译一次,提高了将来生成的生成性能。
//这还将影响IntelliSense性能,包括代码完成和许多代码浏览功能。
//但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
//请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
#ifndefPCH_H
#definePCH_H
extern"C"_declspec(dllexport)intAdd(inta,intb);
extern"C"_declspec(dllexport)intSub(inta,intb);
//添加要在此处预编译的标头
#include"framework.h"
#endif//PCH_H

//pch.cpp:与预编译标头对应的源文件
#include"pch.h"
//当使用预编译的头时,需要使用此源文件,编译才能成功。
intAdd(inta,intb)
{
returna+b;
}
intSub(inta,intb)
{
returna-b;
}
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:09:37 | 显示全部楼层
知道为啥了,C++默认使用的cdecl调用方式,在Delphi调用时也使用关键字cdecl来调用
functionAdd(a:Integer;b:Integer):Integer;cdecl;external'Dll1.dll';
或者把C++改为stdcall的调用方式就行了
参考:
https://www.cnblogs.com/jiftle/p/8451336.html
https://blog.csdn.net/sss_369/article/details/87473329
回复

使用道具 举报

千问 | 2021-1-27 05:09:37 | 显示全部楼层
顶你~


回复

使用道具 举报

千问 | 2021-1-27 05:09:37 | 显示全部楼层


是这样的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行