3 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
您應(yīng)該顯示.argtypes和.restype嘗試,但是嘗試一下:
from ctypes import wintypes as w
class FTRSCAN_IMAGE_SIZE(ctypes.Structure):
_fields_ = [('nWidth', ctypes.c_int),
('nHeight', ctypes.c_int),
('nImageSize', ctypes.c_int)]
FTRHANDLE = ctypes.c_void_p
lib = ctypes.WinDLL('ftrScanAPI.dll')
lib.ftrScanOpenDevice.argtypes = None
lib.ftrScanOpenDevice.restype = FTRHANDLE
lib.ftrScanGetImageSize.argtypes = FTRHANDLE,ctypes.POINTER(FTRSCAN_IMAGE_SIZE)
lib.ftrScanGetImageSize.restype = w.BOOL
檢查WinDLLvs. 的使用CDLL。您的Python是否為64位并不重要,但在32位Python上卻有所不同。使用CDLL如果函數(shù)使用C調(diào)用約定(__cdecl)和WinDLL若函數(shù)使用__stdcall調(diào)用約定。如果頭文件不清楚,則默認(rèn)通常為_(kāi)_cdecl。 編輯:從API鏈接中的另一個(gè)答案,它是__stdcall并且WinDLL應(yīng)該使用。

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
問(wèn)題似乎只是設(shè)備句柄是一個(gè)64位實(shí)體(類型定義的指向void的指針)。它可以在Windows 7中正常工作只是偶然,因?yàn)榫浔母?3位正確為零。
ctypes中所有函數(shù)的返回類型默認(rèn)為32位int?,F(xiàn)在,在Windows 10中,似乎已設(shè)置了第32位(符號(hào)位),當(dāng)將handle-coerced-to-int推入64位堆棧進(jìn)行函數(shù)調(diào)用時(shí),這會(huì)導(dǎo)致符號(hào)擴(kuò)展。結(jié)果地址的所有高位都設(shè)置為(0xFFFFFFFFA ...),它指向內(nèi)核空間而不是用戶空間。
因此,也許您可以使用
lib.ftrScanOpenDevice.restype = c_void_p
這并不是說(shuō)您不應(yīng)該為所有函數(shù)定義參數(shù)和返回類型,而應(yīng)該-否則,它們將僅遵循C語(yǔ)言的默認(rèn)參數(shù)提升規(guī)則,然后工作……或者完全無(wú)法工作,具體取決于函數(shù)原型本身是否與默認(rèn)參數(shù)提升兼容。例如,如果不定義原型就不能正確調(diào)用任何接受floats作為參數(shù)的函數(shù)。
- 3 回答
- 0 關(guān)注
- 580 瀏覽
添加回答
舉報(bào)