2008-10-27 84 views
9

我有一个第三方产品,一个终端仿真器,它提供了一个DLL,可以链接到一个C程序,基本上可以自动驱动本产品(发送击键,检测屏幕上显示的内容等等)。如何从脚本语言调用DLL?

我想从脚本语言(我对Python感到舒适,对Perl不那么重要)驱动它,这样我们就不必在遇到问题时编译并向客户发送可执行文件。

我们也希望客户能够使用我们的基线编写他们自己的脚本,他们不会考虑编写和编译C代码的想法。

获取Python/Perl与Windows DLL连接的好方法是什么?我的第一个想法是编写一个服务器程序,并让一个Python脚本通过TCP与它通信,但是必须有一个更简单的解决方案。

回答

15

一种方式来调用C库从Python是使用ctypes

>>> from ctypes import * 
>>> windll.user32.MessageBoxA(None, "Hello world", "ctypes", 0); 
12

在Perl,Win32::API是一个简单的方法来一些对接口的DLL。如果您有权访问编译器和Windows头文件,也有Inline::C

的Perl XSUB S还可以创建Perl和C.

+0

加入XS,我们有自己的赢家。 – 2008-10-27 18:08:15

5

之间的界面在Perl中,P5NCI还将做到这一点,至少在某些情况下。但在我看来,直接管理与dll接口的任何东西都会对用户不友好,如果您要有一个用户(scriptor?)友好包装器,那么它可能就是一个XS模块。

我想我没有看到“编译和发出可执行文件”和“编译和发送脚本”之间的有意义的区别。

4

对于Python,你可以编译一个链接到DLL的扩展,这样在Python中你可以像普通模块一样导入它。您可以通过使用像Boost.Python这样的库,或者使用诸如SWIG(也支持Perl和其他脚本语言)的工具来自动生成包装器来手动完成此操作。

3

Python Py_InitModule API函数允许您从c/C++函数创建一个模块,然后可以从Python中调用它。

大约需要的C/C++代码十几线实现,但它是很容易写代码:

https://python.readthedocs.org/en/v2.7.2/extending/extending.html#the-module-s-method-table-and-initialization-function

Zeus编辑器,我写的,使用此appoach允许Zeus宏用Python编写,效果很好。

+0

如果你在你的答案中写了一个“hello world”的例子,而不是一个不实际的页面的链接,你不会是这个答案列表的最新版本:-) – Davide 2009-11-14 05:53:03