鱼C论坛

 找回密码
 立即注册
查看: 3279|回复: 4

[已解决]ctypes模块访问C语言函数返回指针报错

[复制链接]
发表于 2023-1-21 18:13:37 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 Minecraft程序猿 于 2023-1-22 00:30 编辑

如题
报错信息:
Python 3.11.1 (tags/v3.11.1:a7a450f, Dec  6 2022, 19:58:39) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cinterface
>>> cinterface.run_find("D:", "main.c")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\repos\ProC\slrc_build\finder\cinterface.py", line 24, in run_find
    target = engine.find(c_char_p(directory.encode()), c_char_p(pattern.encode())).contents
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: NULL pointer access
问题源码:
from ctypes import *

engine = windll.LoadLibrary("./refinder_engine.dll")

class File_list(Structure):
    pass

File_list._fields_ = [\
    ("next", POINTER(File_list)), 
    ("file_type", c_char),
    ("file_name", c_char_p)]

engine.find.argtypes = [c_char_p, c_char_p]
engine.find.restype = POINTER(File_list)

def run_find(directory:str, pattern:str) -> list:
    '''Perform Find Operations.
    Usage: run_find(directory, pattern)
      e.g. run_find("C:\", "main.c")
    Return:A list([(name_1, type_1), (name_2, type_2), ...])
    '''
    table = []
    # print(engine.find(c_char_p(directory.encode()), c_char_p(pattern.encode())))
    target = engine.find(c_char_p(directory.encode()), c_char_p(pattern.encode())).contents
    while target != POINTER(None):
        table.append((target.file_name, target.file_type))
        target = target.next
    return table
结构体定义:
typedef struct File_type
{
        struct File_type *next;
        char file_type;
        char file_name[261];
}file, *pfile;
需要访问的C函数原型:
DLL_EXPORT pfile __stdcall find(char *workdir, char *pattern);
源代码及已编译 Dll 资源文件(编译器: gcc(MinGW-w64)):
finder.zip (15.87 KB, 下载次数: 0)
已经解决 是Python端类型声明错误
最佳答案
2023-1-21 18:13:38
把谁设为最佳答案?

最佳答案

查看完整内容

把谁设为最佳答案?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-21 18:13:38 | 显示全部楼层    本楼为最佳答案   
把谁设为最佳答案?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-21 18:25:55 | 显示全部楼层
等下 我似乎找到原因了,路径要加上分隔符,第一个参数传"D:"会出问题,而"D:\\"就不会(引向了下一个bug...),另外一点,第8行_fields_要改成__fields__...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-1-21 23:42:46 | 显示全部楼层
不需要回答了 问题已解决 最后附上完整的项目文件 refinder_release.zip (16 KB, 下载次数: 1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-2-1 15:37:17 | 显示全部楼层
本帖最后由 Minecraft程序猿 于 2023-2-1 15:39 编辑
KeyError 发表于 2023-1-31 17:31
把谁设为最佳答案?

emmm...我项目都搞完了(利用高一寒假仅有的3天)
GitHub项目地址 https://github.com/Littlebox-Logic/Refinder
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 07:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表