我正在尝试在Codeblocks中使用Visual Studio 2008 SP1创建的dll(启用了公共语言运行时支持)(在mingw下使用GCC)。传递给dll的一些参数已由调用函数动态分配。我的问题是:
"传递给dll的参数是否可以驻留在调用函数的堆上。这样做是否安全?"
从dll返回时,调用函数的堆栈被破坏,在尝试访问它们时,当我尝试调试此问题时,我在codeblocks中得到了一个SIGTRAP。
这可能是什么原因?
dll函数的原型如下:
int __cdecl myTesseractOCR(myOCRData* labels_for_ocr);
myOCRDaata定义如下所示:
typedef struct __ocr_data
{
char* arr_image [NUMOBJ_LIMIT_HIGH];
int start_x [NUMOBJ_LIMIT_HIGH];
int start_y [NUMOBJ_LIMIT_HIGH];
int width [NUMOBJ_LIMIT_HIGH];
int height [NUMOBJ_LIMIT_HIGH];
int widthstep [NUMOBJ_LIMIT_HIGH];
char number_plate_buff [2*NUMOBJ_LIMIT_HIGH];
int ocr_label_count;
} myOCRData;
arr_image指向驻留在调用函数堆上的数据,其中上述结构的所有其他成员都驻留在调用函数的堆栈上。驻留在堆栈上的所有成员都被破坏,程序生成SIGTRAP。我已经看到在堆栈溢出的各种线程中讨论了这些问题,但还没有找到具体的解决方案。
答案 0 :(得分:1)
我建议您尽可能将DLL接口设为 flat ;即使它们是POD,也要避免通过结构。由于您使用的是2种不同的编译器,因此这一点尤其重要。如果您决定传递结构,请确保在两个编译器下明确定义结构的打包。
答案 1 :(得分:0)
DLL访问驻留在调用应用程序堆上的内存是完全合理的。如果你不能这样做,那么DLL本来就没用了。
你的问题必须在别的地方。很可能你没有正确设置正确调用DLL的参数。
答案 2 :(得分:0)
你能否交叉检查GCC和DLL约定VS2kSP1 CLR的调用约定标志
答案 3 :(得分:0)
堆不属于某个函数。在模块中分配内存并将其传递给另一个模块是完全正常的,只需确保分配内存的模块是释放它的模块。
第二个麻烦来源可能是不同的呼叫转换。为所有导出的函数指定调用约定。