2012-01-09 35 views
8

Tôi đang cố gọi các hàm từ một DLL có vẻ như được tạo trong Delphi. Ví dụ về một số chức năng được DLL hỗ trợ là:Python có thể gọi hàm Delphi trong một DLL không?

function oziDeleteWpByName(var name:pansichar):integer;stdcall 

Mã Python mà tôi đã viết để truy cập các chức năng trên không hoạt động.

from ctypes import * 
libc = cdll.OziAPI 
name ='test' 

pi = pointer(name) 

delname = libc.oziDeleteWpByName 

delname(name) 

Dường như tôi đang chuyển loại dữ liệu sai cho hàm. Bất kỳ ý tưởng về làm thế nào để làm điều đó phải không?

Cảm ơn nó đã hoạt động. Bây giờ, hãy trợ giúp với chức năng này:

chức năng oziGetOziVersion (var Phiên bản: pansichar; var Dữ liệu: số nguyên): số nguyên; stdcall; Phiên bản OziExplorer được trả lại trong biến Phiên bản.

Bây giờ, làm cách nào để chuyển 'phiên bản var' khi nó cũng sẽ được trả lại.

+0

'var name: pansichar' ngụ ý rằng tham số' name' có thể được sửa đổi và trả về cho người gọi. Liệu chức năng thực sự làm điều đó? Bạn có định đọc nội dung của 'tên' sau khi hàm trả về không? –

+0

Ngoài ra, bạn đang sử dụng phiên bản Python nào? Có thể tạo sự khác biệt cho mã hóa chuỗi. –

+0

vâng, khai báo 'var' đó là tanh. Nếu bạn, người dùng 1138 ... đã viết DLL đó, tại sao bạn làm điều đó? –

Trả lời

1

Trong Delphi, thông số var được chuyển bằng tham chiếu. Vì vậy, những gì bạn có có một con trỏ đến một PAnsiChar (hay còn gọi là con trỏ chuỗi kiểu C). Nếu bạn đang chuyển cho nó một con trỏ chuỗi, thay vì một con trỏ tới một con trỏ chuỗi, nó sẽ không hoạt động.

+0

Tôi cũng không thấy trong mã Python đó bất cứ điều gì cho thấy bạn đang chỉ định quy ước gọi 'stdcall'. Không 'cdll' trong Python mặc định là' cdecl'? Nếu vậy, điều này cũng sẽ gây ra vấn đề cho bạn! – LaKraven

+0

Tôi khá chắc chắn rằng bất cứ điều gì bạn gọi thông qua một dll và thư viện thời gian chạy python tải và gọi, sẽ luôn luôn sử dụng các quy ước gọi các cửa sổ tiêu chuẩn. –

+2

@Warren Không, LaKraven là đúng. 'cdll' vs' windll' là cách xác định quy ước cuộc gọi. Ngoài ra, không có tiêu chuẩn Windows để gọi quy ước, ít nhất là trên x86. Một số thư viện sử dụng 'stdcall' và một số sử dụng' cdecl'. Hãy suy nghĩ của msvcrt ví dụ. Đó là tất cả 'cdecl'. –

11
from ctypes import * 

# Not strictly needed but it's good to be explicit. 
windll.OziAPI.oziDeleteWpByName.argtypes = [POINTER(c_char_p)] 
windll.OziAPI.oziDeleteWpByName.restype = c_int 

p = c_char_p('test') 
retval = windll.OziAPI.oziDeleteWpByName(byref(p)) 
+0

Điểm tốt. Đã sửa. – yak

+0

Cập nhật với 'argtypes' và' restype'. – yak

+0

Tốt, bạn đã có upvote của tôi bây giờ –

Các vấn đề liên quan