我在Windows XP上用Delphi(D7和D2006)编程(在不久的将来迁移到Windows 7)。我需要使用数学库来完成我正在做的一些工作和大多数数学库(我现在倾向于Mathematica)我看过会产生编译的C代码。这样的代码将为我的主程序提供特定的功能。
我有一个非常基本的问题 - 考虑到这个开发设置 - 我如何开始使用Delphi编译的c代码?我真的需要宝贝步骤让我开始这个过程。
答案 0 :(得分:4)
我的FE产品OrcaFlex已经完成了很多这方面的工作。您有两个选项可以链接到Delphi的C代码:静态或动态。我静态链接,因为它使分发和版本控制更容易。但是让它静态工作真是一个绝招,你必须依赖Delphi的一些无证方面。
我怀疑为了您的需求,动态链接是最好的。基本上,您需要编译C代码并将其链接到DLL中。我建议使用Borland C编译器来执行此操作。您可以使用免费命令行版本BCC55来执行此操作。使用Borland C的优势在于它对Delphi的8087浮点单元做出了相同的假设。如果使用MSVC构建,则会发现MS已选择不引发浮点异常。 Borland C确实提出了浮点异常。这是一个很好的例子,但如果你想要运送一个你需要强大的产品,它就变得相关了。
你应该知道,默认情况下,C代码将使用C调用约定,我只是坚持使用它。通过将外部例程声明为cdecl调用约定,将它带入Delphi。
您需要注意的另一件事是在两个模块之间定义清晰的界面。您需要确保异常不跨越模块边界,并且不跨越边界传递任何特殊类型(例如Delphi字符串)。所以对于字符串使用PChar(或者更好的PAnsiChar或PWideChar,以确保在升级到Delphi 2009及更高版本时它不会改变意义)。
答案 1 :(得分:3)
我对Lohninger的SDL图书馆感到非常满意(http://www.lohninger.com/mathpack.html)。它是用Delphi编写的,并直接编译到您的应用程序中,因此没有捆绑或调用约定问题或浮点使用差异,正如此线程中的其他响应所讨论的那样。
看看他包含的内容。如果您很幸运,他的图书馆将满足您的需求,您将能够使用它!
答案 2 :(得分:2)
如果您目前安装了Mathematica,请转到文档中心并查找guide/CLanguageInterface
,否则该指南为available on the web并在那里阅读。
我的理解是Mathematica可以生成通过MathLink连接Mathematica引擎的C程序,如果你需要全功能,或者你只需要更低级别的功能,那么它就能生成可以静态链接的代码。编译Mathematica库。所以可以使用独立代码。
请参阅Code Generator documentation。
如果你可以将C程序转换为DLLs,那么使用外部声明从Delphi访问这些外部函数相对简单。
function MathematicaRoutine(const x : double) : double; external 'MyInterface.dll';
如果你需要实现一个静态绑定,那么必须有很多复杂的工作才能实现静态绑定,如果没有安装Mathematica,如果可能的话。我从未尝试过。
答案 3 :(得分:2)
您可以使用RAD Studio将项目与Delphi和C ++(Builder)代码混合使用。将自动创建的C代码放入C ++ Builder文件(.cpp),然后添加Delphi文件。