Bạn đã nói bạn đang cố gọi một hàm không được xuất; theo như tôi biết, điều đó là không thể từ Python. Tuy nhiên, vấn đề của bạn dường như chỉ đơn thuần là cái tên bị xé.
Bạn có thể gọi xuất khẩu tùy ý bằng cách sử dụng ctypes. Vì tên bị xé, và không phải là một mã định danh Python hợp lệ, bạn có thể sử dụng getattr().
Một cách tiếp cận khác nếu bạn có thông tin chính xác là tìm xuất khẩu theo thứ tự, bạn phải làm gì nếu không có tên nào được xuất khẩu. Một cách để có được thứ tự sẽ sử dụng dumpbin.exe, được bao gồm trong nhiều ngôn ngữ biên dịch Windows. Nó thực sự là một front-end cho mối liên kết, vì vậy nếu bạn có MS LinK.exe, bạn cũng có thể sử dụng nó với các công tắc dòng lệnh thích hợp.
Để có được tài liệu tham khảo chức năng (mà là một "chức năng-con trỏ" đối tượng liên kết với địa chỉ của nó), bạn có thể sử dụng một cái gì đó như:
ctypes nhập khẩu func = getattr (ctypes.windll.msvcrt, "@@ myfunc") retval = func (Không)
Đương nhiên, bạn sẽ thay thế 'msvcrt' bằng dll bạn đặc biệt muốn gọi.
Những gì tôi không hiển thị ở đây là cách hủy bỏ tên để lấy được chữ ký gọi, và do đó các đối số cần thiết. Việc đó sẽ yêu cầu một trình gỡ rối, và chúng rất cụ thể đối với thương hiệu AND VERSION của trình biên dịch C++ được sử dụng để tạo DLL.
Có một số lỗi nhất định kiểm tra xem chức năng có phải là stdcall hay không, vì vậy đôi khi bạn có thể giải quyết mọi thứ cho đến khi bạn nhận được đúng. Nhưng nếu chức năng là cdecl, thì không có cách nào để tự động kiểm tra. Tương tự như vậy bạn phải nhớ bao gồm thêm tham số này nếu thích hợp.
Nguồn
2009-01-27 19:41:12