在 FreePascal 中使用 C/C++ DLL

Using a C/C++ DLL with FreePascal

首先,我使用 Mingw 4.8 作为 Code:blocks 13.12 和 Lazarus 1.4.2 中的 C++ DLL 的编译器来处理 pascal 代码。(windows 7)

我需要用 c++ 或 c 生成一个可以从 pascal 程序调用的 dll。

问题是我对 pascal 的知识是空的,制作一个简单的程序看起来并不复杂,但我找不到关于如何导入和使用 C/C++ 的好信息DLL.

moreless 唯一起作用的是:http://www.drbob42.com/delphi/headconv.htm 我的真实代码:

帕斯卡:

funtion hello():Integer; external 'function' index 1;
...
Label1.Caption:=IntToStr(hello()); 

C++ DLL header:

#ifndef function_H
#define function_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef BUILDING_DLL
#define FUNCTION_DLL __declspec(dllexport)
#else
#define FUNCTION_DLL __declspec(dllimport)
#endif
 int __stdcall FUNCTION_DLL hello( );

#ifdef __cplusplus
}
#endif
#endif

C++ 文件:

    #include <stdio.h>

#include "function.h"
  __stdcall int hello( )
{
return 8;
}

但是当尝试传递任何参数或对函数做一些复杂的事情时,开始给出随机数。

这是新代码: 帕斯卡:

function function1(t1:Integer):Integer; external 'function' index 1;  
...
entero:=8;
Label1.Caption:=IntToStr(function1(entero2));

另外,我将 C++ 代码更新为:

C++:

#include <stdio.h>

#include "function.h"
  __stdcall int function1(int t1)
{
return t1*2;
}

Header:

#ifndef funtion_H
#define funtion_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef BUILDING_DLL
#define FUNCTION_DLL __declspec(dllexport)
#else
#define FUNCTION_DLL __declspec(dllimport)
#endif
 int __stdcall FUNCTION_DLL function1(int t1);

#ifdef __cplusplus
}
#endif
#endif

我还阅读了其他信息:http://www.jrsoftware.org/ishelp/index.php?topic=scriptdll。并尝试像这样实现 dll 调用:

帕斯卡:

function function1(t1: Integer): Integer; external 'function1@files:function.dll';

但我收到一条错误消息:

The procedure entry point function1 could not be located in the dynamic link library function.dll

我正在寻找一个可行的示例或一个在线教程或其他可以继续工作的东西,因为我对此非常困惑。 提前谢谢你。

您需要使调用约定匹配。您的 C++ 代码使用 __stdcall。 Pascal 代码没有指定调用约定,因此默认为 register

像这样声明 Pascal 导入:

function function1(t1:Integer):Integer; stdcall; external 'function' index 1;

您确定导入时需要使用索引吗?按名称导入比按序号导入更常见。我希望看到导入看起来像这样:

function function1(t1:Integer):Integer; stdcall; external 'function';

无参数函数成功的原因是对于无参数函数,调用约定的差异无关紧要。一旦开始传递参数,stdcall 表示参数通过堆栈传递,而 register 表示它通过寄存器传递。这种不匹配解释了您观察到的行为。