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

herlockkn 2020-04-28 04:56:59
unit Unit1;

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;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

function Add(a: Integer; b: Integer): Integer; stdcall; external 'Dll1.dll';

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.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 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。

#ifndef PCH_H
#define PCH_H

extern "C" _declspec(dllexport) int Add(int a, int b);
extern "C" _declspec(dllexport) int Sub(int a, int b);

// 添加要在此处预编译的标头
#include "framework.h"

#endif //PCH_H



// pch.cpp: 与预编译标头对应的源文件

#include "pch.h"

// 当使用预编译的头时,需要使用此源文件,编译才能成功。
int Add(int a, int b)
{
return a + b;
}

int Sub(int a, int b)
{
return a - b;
}
...全文
91 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dw.z 2020-04-30
  • 打赏
  • 举报
回复
顶你~
tanqth 2020-04-30
  • 打赏
  • 举报
回复
是这样的。
herlockkn 2020-04-29
  • 打赏
  • 举报
回复
知道为啥了,C++默认使用的cdecl调用方式,在Delphi调用时也使用关键字cdecl来调用 function Add(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

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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