我正在尝试使用python和ctypes从ssdeep使用fuzzy.dll
。到目前为止,我尝试过的所有操作都因访问冲突错误而失败。这是更改为包含fuzzy.dll
和fuzzy.def
文件的正确目录后的操作:
>>> import os,sys
>>> from ctypes import *
>>> fn = create_string_buffer(os.path.abspath("fuzzy.def"))
>>> fuzz = windll.fuzzy
>>> chash = c_char_p(512)
>>> hstat = fuzz.fuzzy_hash_filename(fn,chash)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
WindowsError: exception: access violation writing 0x00000200
>>>
据我了解,我已经通过了正确的
c_types
。来自fuzzy.h
:extern int fuzzy_hash_filename(char * filename, char * result)
我就是无法克服这种访问冲突。
最佳答案
您的代码有两个问题:
您不应使用windll.fuzzy
,而应使用cdll.fuzzy
-从ctypes documentation开始:
cdll加载使用标准cdecl调用约定导出函数的库,而windll库使用stdcall调用约定调用函数。
对于返回值(chash
),应声明一个缓冲区,而不是创建指向0x0000200
(= 512)的指针-这是访问冲突的来源。请改用create_string_buffer('\000' * 512)
。
因此,您的示例应如下所示:
>>> import os, sys
>>> from ctypes import *
>>> fn = create_string_buffer(os.path.abspath("fuzzy.def"))
>>> fuzz = cdll.fuzzy
>>> chash = create_string_buffer('\000' * 512)
>>> hstat = fuzz.fuzzy_hash_filename(fn,chash)
>>> print hstat
0 # == success
关于python - 将Python Ctypes用于ssdeep的Fuzzy.dll但收到错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/510443/