我正在尝试使用python和ctypes从ssdeep使用fuzzy.dll。到目前为止,我尝试过的所有操作都因访问冲突错误而失败。这是更改为包含fuzzy.dllfuzzy.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/

10-09 05:39