簡體   English   中英

Python dll function 返回錯誤值

[英]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 = 0dbHandle = 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 = -2147352576handle = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM