[英]Python dll function return wrong value
使用 C# 我調用 dll function 如下:
[DllImport("Tnzv01.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern unsafe int TnzDDBOpenDatabase(byte[] dbFile, out IntPtr dbhDatabase);
var dbFile = Encoding.ASCII.GetBytes(FilePath);
var errorCode = TnzDDBOpenDatabase(dbFile, out var dbHandle);
它返回errorCode = 0
和dbHandle = 0x140e0690
我正在嘗試使用 python 執行此操作:
dll = ctypes.CDLL(os.path.join("dependence", "Tnzv01.dll"))
tzh_file = bytes(r"D:\PycharmProjects\tnz_analysis_32\new_3000_57_63_421_461_464_2485.tzh", 'ASCII')
open_db_fun = dll.TnzDDBOpenDatabase
open_db_fun.restype = ctypes.c_int
open_db_fun.argtypes = [ctypes.c_byte * 70, ctypes.POINTER(ctypes.c_int)]
handle = ctypes.c_int(0)
c_tzh_file = (ctypes.c_byte * len(tzh_file))(*tzh_file)
result = open_db_fun(c_tzh_file, handle)
但它返回result = -2147352576
和handle = c_long(-1)
為什么 python 給出錯誤的結果?
查看實際的 C 原型會更有用,但請嘗試以下操作:
dll = ctypes.CDLL(os.path.join("dependence", "Tnzv01.dll"))
tzh_file = rb"D:\PycharmProjects\tnz_analysis_32\new_3000_57_63_421_461_464_2485.tzh"
open_db_fun = dll.TnzDDBOpenDatabase
open_db_fun.restype = ctypes.c_int
open_db_fun.argtypes = ctypes.c_char_p,ctypes.POINTER(ctypes.c_void_p)
handle = ctypes.c_void_p()
result = open_db_fun(tzh_file,ctypes.byref(handle))
您可以直接傳遞字節字符串,假設第一個參數的 C 類型是const char*
,第二個參數類似於HANDLE*
。 句柄通常在幕后是void*
,指針是 64 位的,而ctypes.c_int
只是 32 位的。 通過引用傳遞第二個參數,因為它是一個輸出參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.