2008-10-27 5 views
9

Tôi có một sản phẩm của bên thứ ba, một trình mô phỏng thiết bị đầu cuối, cung cấp một DLL có thể được liên kết với chương trình C để tự động hóa lái xe của sản phẩm này (gửi tổ hợp phím, phát hiện những gì trên màn hình và vv).Làm cách nào để gọi một tệp DLL từ ngôn ngữ kịch bản?

Tôi muốn sử dụng ngôn ngữ kịch bản (Tôi thấy thoải mái với Python và hơi ít hơn với Perl) để chúng tôi không phải biên dịch và gửi các tệp thực thi cho khách hàng của mình bất cứ khi nào có sự cố.

Chúng tôi cũng muốn khách hàng có thể viết kịch bản của riêng họ bằng cách sử dụng của chúng tôi làm đường cơ sở và họ sẽ không giải trí ý tưởng viết và biên dịch mã C.

Cách tốt để nhận Python/Perl giao diện với tệp DLL Windows. Suy nghĩ đầu tiên của tôi là viết một chương trình máy chủ và có một kịch bản Python giao tiếp với nó thông qua TCP nhưng phải có một giải pháp dễ dàng hơn.

Trả lời

15

Một cách để gọi thư viện C từ Python là sử dụng ctypes:

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

Trong Perl, Win32::API là một cách dễ dàng để một số interfacing để DLL. Ngoài ra còn có Inline::C, nếu bạn có quyền truy cập vào trình biên dịch và các tiêu đề cửa sổ.

Perl XSUB s cũng có thể tạo một giao diện giữa Perl và C.

+0

Thêm XS và chúng tôi có chính mình là người chiến thắng. –

5

Trong Perl, P5NCI cũng sẽ làm điều đó, ít nhất là trong một số trường hợp. Nhưng có vẻ như với tôi bất cứ thứ gì bạn sử dụng trực tiếp quản lý giao tiếp với dll sẽ trở thành người dùng không thân thiện, và nếu bạn sẽ có một trình bao thân thiện với người dùng (scriptor?), Nó cũng có thể là một mô-đun XS.

Tôi đoán tôi không thấy sự khác biệt có ý nghĩa giữa "biên dịch và gửi tệp thi hành" và "biên dịch và gửi tập lệnh".

4

Đối với Python, bạn có thể biên dịch một phần mở rộng liên kết đến DLL, để trong Python bạn chỉ có thể nhập nó như một mô-đun bình thường. Bạn có thể làm điều này bằng tay, bằng cách sử dụng một thư viện như Boost.Python, hoặc bằng cách sử dụng một công cụ như SWIG (cũng hỗ trợ Perl và các ngôn ngữ kịch bản khác) để tạo ra một trình bao bọc tự động.

3

Hàm python Py_InitModule API cho phép bạn tạo mô-đun từ các hàm c/C++ mà sau đó có thể gọi từ Python.

Nó mất khoảng một chục hay như vậy dòng c/C++ mã để đạt được nhưng nó là khá dễ dàng mã để viết:

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

Biên tập viên Zeus mà tôi đã viết, sử dụng appoach này để cho phép Zeus macro được viết bằng Python và nó hoạt động rất tốt.

+0

nếu bạn đã viết một ví dụ "hello world" trong câu trả lời của mình, thay vì liên kết đến trang không thực tế, bạn sẽ không phải là danh sách trả lời mới nhất :-) – Davide

+0

Liên kết mà tôi cung cấp đã chứa đơn giản ví dụ 'hello world'. Từ liên kết được cung cấp: "Ví dụ có thể được tìm thấy trong tệp Demo/embed/demo.c trong bản phân phối nguồn Python". – jussij