1

我有一个用Free Pascal编写的程序。它从运行时选择的 DLL 中导入函数。它们是使用pascal;关键字导入的。我想使用 python 代码扩展这个程序。我发现在这种情况下蜕皮可能对我有帮助。我需要如何进行?事实上,我想“将 python 代码编译为 DLL”。除了任何免费或开源工具/编译器之外,我还可以使用 Microsoft Visual Studio 2012 和 VC++ 来解决我的问题。

4

2 回答 2

3

假设 Pascal 可以使用 c 外部函数,直接使用 python c-api 是可能的。我认为您的第一步是了解用于将 cpython 嵌入其他应用程序的 api python 公开。

http://docs.python.org/2/extending/

于 2013-09-23T12:58:44.007 回答
2

pascal修饰符是调用约定的声明。参数从左到右压入堆栈。与cdecl将参数从右到左推送以支持C 中的可变参数函数的调用约定相比stdcall。修饰符是另一种从右到左的调用约定。

Free Pascal 支持这两种调用约定。这是Free Pascal 的cdeclstdcallpascal。调用约定绝对不兼容。如果你调用一个预期的函数,它的参数以某种顺序排列,而堆栈以另一种顺序排列——坏事就会发生。

您可能需要使用 cdecl 来使用 Python 扩展 Free Pascal,该 Python 已编译为带有 shedskin 的 C++ 代码。我认为所有Windows DLL 都使用帕斯卡转换,而不管 DLL 是用什么语言编写的。

因此,请确保您使用正确的调用约定——取决于您使用代码的位置。

于 2013-09-23T14:23:45.053 回答