Dll 导致 Python 在使用 memset 时崩溃



我一直在做一个项目,我正在尝试使用一个旧的CodeBase库,用C++编写的,用Python编写。我想要的是使用代码库重新索引具有 .cdx 索引的.dbf文件。但目前,Python在运行时崩溃。更详细的解释将在后面进行。

至于 Python,我使用 ctypes 加载 dll,然后执行我自己添加的函数,这应该不会引起任何问题,因为它不使用 CodeBase 本身不使用的单行代码。
蟒蛇代码:

import ctypes  
cb_interface = ctypes.CDLL("C4DLL.DLL")  
cb_interface.reindex_file("C:\temp\list.dbf")  

这是我添加的代码库函数,但它需要一些我现在无法提供的知识,而不会把这个问题搞砸很多。如有必要,我将尽可能多地提供进一步的见解:

S4EXPORT int reindex_file(const char* file){
    CODE4 S4PTR *code;
    DATA4 S4PTR *data;
    code4initLow(&code, 0, S4VERSION, sizeof(CODE4));
    data = d4open(code, file);
    d4reindex(data);
    return 1;
}

根据我自己的调试,我的问题发生在code4initLow中。当 dll 到达以下代码行时,Python 崩溃并显示一个窗口,显示"python.exe 已停止工作":

memset( (void *)c4, 0, sizeof( CODE4 ) ) ;

这里的 C4 与上一个代码块中的代码是相同的对象。

dll 在运行时尝试更改内存是否存在问题?如果我从我的 python 脚本创建一个 .exe 文件,它会消失吗?

如果有人能回答我这些问题和/或为我的python崩溃问题提供解决方案,我将不胜感激。

最后但并非最不重要的一点是,这是我在这里的第一个问题。如果我不小心违反了这里的成文或不成文规则,我深表歉意并承诺尽快修复。

首先,指针code不指向任何地方,因为它是未初始化的。其次,您实际上不会尝试填充结构,因为您将指针传递给指针memset

您可能应该做的是将code声明为普通结构实例(而不是指针),然后在将其传递给 d4open 时使用 &code

就像Joachim Pileborg说的那样,将Null指针传递给code4initLow。("替代")解决方案是为结构体CODE4 S4PTR *code = (CODE4*)malloc(sizeof(CODE4));分配内存,然后像code4initLow(code, 0, S4VERSION, sizeof(CODE4));一样传递指针。

最新更新