第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

不同操作系統(tǒng)上的python ctypes問(wèn)題

不同操作系統(tǒng)上的python ctypes問(wèn)題

C
縹緲止盈 2020-02-03 12:38:55
我正在嘗試將C函數(shù)轉(zhuǎn)換為python 3.6使用。代碼如下:lib = ctypes.WinDLL('ftrScanAPI.dll') # provided by fingerprint scannerclass FTRSCAN_IMAGE_SIZE(ctypes.Structure):    _fields_ = [    ("nWidth", ctypes.c_int),    ("nHeight", ctypes.c_int),    ("nImageSize", ctypes.c_int)]print('Open device and get device handle...')hDevice = lib.ftrScanOpenDevice()print('handle is', hDevice)print('Get image size...')Image_size = FTRSCAN_IMAGE_SIZE(0, 0, 0)if lib.ftrScanGetImageSize(hDevice, ctypes.byref(Image_size)):    print('Get image size succeed...')    print('  W', Image_size.nWidth)    print('  H', Image_size.nHeight)    print('  Size', Image_size.nImageSize)else:    print('Get image size failed...')函數(shù)定義:typedef struct FTR_PACKED __FTRSCAN_IMAGE_SIZE {    int nWidth;    int nHeight;    int nImageSize;} FTRSCAN_IMAGE_SIZE, *PFTRSCAN_IMAGE_SIZE;FTRHANDLE ftrScanOpenDevice();  # typedef void *  FTRHANDLE;BOOL ftrScanGetImageSize(FTRHANDLE ftrHandle,     PFTR_SCAN_IMAGE_SIZE pImageSize);但是具有相同代碼的不同操作系統(tǒng)似乎具有不同的結(jié)果:在Windows 7 64位上輸出1在Windows 10 64位上,我不打印“句柄在這里” 輸出2我已嘗試的操作:根據(jù)有關(guān)堆棧溢出的一些答案,這可能是由于未明確分配函數(shù)argtypes和restype引起的,所以我嘗試并失敗了。
查看完整描述

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)該使用。


查看完整回答
反對(duì) 回復(fù) 2020-02-03
?
繁花如伊

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ù)。


查看完整回答
反對(duì) 回復(fù) 2020-02-03
  • 3 回答
  • 0 關(guān)注
  • 580 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)