我一直致力于一个项目,我正在尝试使用旧的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问题提供解决方案,我将不胜感激。
最后但同样重要的是,这是我的第一个问题。如果我在这里意外地设法违反了书面或不成文的规则,我会道歉并承诺尽快解决。
答案 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));
一样传递指针。