如何在TCL中使用编译好的Delphi DLL?

3
我已经使用Delphi和TCL一段时间了,用于两种不同的目的。现在,我有一些在Delphi中实现的功能集合。我想在TCL实用程序中重用这些功能。 TCL程序不是一个独立的程序,它被用来在CAD工具中做脚本编写。
这里讨论的功能与特定的XML解析相关,我发现TCL有包来读取/写入XML文件。但是,我在思考是否可以直接重用整个逻辑。
我在Google上搜索了这个主题,但大多数帮助都与为C/C++创建TCL包装器有关。请指导如何在TCL代码中调用导出函数。

据我所知,TCL是高性能eBay Web服务器的基础。我认为它已经拥有了高速XML处理库。 - Arioch 'The
是的,TCL有XML库。我的意思是,我不想在TCL中重新编写所有逻辑(除了读/写XML之外)。 - skjoshi
1个回答

8
关于二进制Interop的事情是,用于创建DLL的编程语言并不重要。为了论证这一点,让我们考虑一个在C ++中声明的函数,如下所示:
int __stdcall foo(double bar);

假设这个函数是从DLL中导出的。现在考虑这个Delphi函数:

function foo(bar: Double): Integer; stdcall;

再假设它是从一个DLL中导出的。

现在,这两个DLL至少在它们的接口上是无法区分的。如果你能从TCL调用C++ DLL,那么你也可以调用Delphi DLL。

所有这一切的底线是,由于您已经知道如何从TCL调用C++ DLL,因此您可以使用完全相同的机制来调用Delphi DLL。您的问题实际上基于错误的前提,认为C++ DLL需要与Delphi DLL不同的处理方式。

您可能需要的唯一额外信息是了解C++和Delphi互操作之间的映射,对此我建议您参考Rudy Velthuis的优秀文章:http://rvelthuis.de/articles/articles-convert.html


我将在这里把所有的 C++ 都替换成 C:对于 C++,在有类的情况下,导出名称会被重命名(不同编译器使用不同的重命名方案),并且从 C++ 代码编译的 DLL 应该看起来“正常”,因此导出的 C++ 顶级函数声明应该包装在一个 export "C" { ... } 块中。所以为了简单起见,我会在这里始终使用 C - kostix
@kostix 嗯,与C++进行交互是完全可行的,而且C++是一种不同于C的语言。显然,您必须遵循交互规则。这是不言而喻的,并且这里没有任何暗示使用C++类。最后,使用名称混淆实际上并不是一个坏主意。这意味着当您意外更改函数声明时,所有内容都会中断。这是一个有用的副作用。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接