2008-10-27 86 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