使用memset时,DLL会导致Python崩溃

时间:2016-03-11 15:29:41

标签: python c++ python-2.7 dll ctypes

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

对于Python,我使用ctypes加载dll然​​后执行我自己添加的函数,这应该不会引起任何问题,因为它不使用CodeBase本身没有使用的单行代码。登记/> Python代码:

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

这是我添加的CodeBase功能,但它需要一些我现在无法提供的知识,而不会引起很多问题。如有必要,我会尽可能提供进一步的见解:

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-crashing问题提供解决方案,我将不胜感激。

最后但同样重要的是,这是我的第一个问题。如果我在这里意外地设法违反了书面或不成文的规则,我会道歉并承诺尽快解决。

2 个答案:

答案 0 :(得分:2)

首先,指针code并未指向任何位置,因为它未初始化。其次,您实际上并没有尝试填充结构,因为您将memset指针传递给指针

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

答案 1 :(得分:0)

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