2008-10-27 20 views
9

Üçüncü taraf ürünü olan bir terminal öykünücüsüne sahibim, bu ürünün sürülmesini otomatik olarak otomatikleştirmek için bir C programına bağlanabilen bir DLL sağlayan bir tuş takımı öykünücüsü (tuş vuruşlarını gönder, ekranda ne olduğunu algılama vb.).Bir kodlama dilinden DLL'yi nasıl çağırabilirim?

Bunu bir komut dosyası dilinden (Python ile rahat ve Perl ile biraz daha azım) kullanmak istiyorum, böylece bir sorun bulunduğunda müşterilerimize yürütülebilir dosyaları derlememiz ve göndermemiz gerekmez.

Ayrıca, müşterilerimizin kendi komut dosyalarını bizimkileri kullanarak taban çizgileri olarak yazabilmelerini ve C kodu yazma ve derleme fikrini eğlendirmelerini istemiyoruz.

Python/Perl'in bir Windows DLL dosyasına bağlanması için iyi bir yoldur. İlk düşüncem bir sunucu programı yazmak ve bir Python betiğini TCP ile iletmek oldu ama daha kolay bir çözüm olmalı. Python C kütüphaneleri aramaya

cevap

15

Tek yön ctypes kullanmaktır:

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

Perl yılında Win32::API DLL'lere arabirim bazı kolay bir yoldur. Bir derleyiciye ve windows başlıklarına erişiminiz varsa, Inline::C da vardır.

Perl XSUB s da Perl Perl ve C

+0

XS ekleyin ve kendimize bir kazanan var. –

5

arasında bir ara yüzey oluşturabilir P5NCI olacak de bunu, en azından bazı durumlarda. Ama bana öyle görünüyor ki, doğrudan dll ile arayüzleri yöneten bir şey kullanıcı dostu olacak ve bir kullanıcı (scriptor?) Dostu sarıcı olacaksa, bir XS modülü de olabilir.

Sanırım "derleme ve yürütülebilir dosyaları gönderme" ve "komut dosyalarını derleme ve gönderme" arasında anlamlı bir ayrım görmüyorum.

4

Python için, DLL'e bağlanan bir uzantı oluşturabilirsiniz; böylece Python'da bunu normal bir modül gibi alabilirsiniz. Bunu, Boost.Python gibi bir kitaplık kullanarak veya otomatik olarak bir sarmalayıcı oluşturmak için SWIG (ayrıca Perl ve diğer komut dosyası dillerini de destekler) gibi bir araç kullanarak el ile yapabilirsiniz.

3

Python Py_InitModule API fonksiyonu daha sonra Python çağrı olabilir c/C++ işlevlerden bir modül oluşturmak için izin verir.

O ulaşmak için kod C/C++ bir düzine kadar hatları sürer ama oldukça kolay kod yazmaktır:

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

yazdım Zeus editör, Zeus izin vermek için bu appoach kullanır Python'da yazılacak makrolar çok iyi çalışıyor.

+0

Cevabınızda "merhaba dünya" örneği yazdıysanız, pratik olmayan bir sayfaya bir bağlantı yerine, bu yanıt listesinin en sonunu olmaz :-) – Davide

+0

Sağladığım bağlantı zaten basit bir bağlantı içeriyor 'Merhaba dünya' örneği. Sağlanan bağlantıdan: "Python kaynak dağıtımında Demo/embed/demo.c dosyasında bir örnek bulunabilir." – jussij

İlgili konular