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;
}
uj5u.com熱心網友回復:
知道為啥了,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
uj5u.com熱心網友回復:
頂你~
uj5u.com熱心網友回復:

是這樣的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/11126.html
標籤:語言基礎/算法/系統設計
上一篇:devc++
下一篇:WIN10+DELPHI10.3+FastReport6.3 使用fastreort里面demo案例時報錯 所有的都一樣 報錯檔案是frxXML.pas
