DLL调用上的堆/堆栈损坏

时间:2011-07-26 11:35:36

标签: c visual-studio-2008 gcc

我正在尝试在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。我已经看到在堆栈溢出的各种线程中讨论了这些问题,但还没有找到具体的解决方案。

4 个答案:

答案 0 :(得分:1)

我建议您尽可能将DLL接口设为 flat ;即使它们是POD,也要避免通过结构。由于您使用的是2种不同的编译器,因此这一点尤其重要。如果您决定传递结构,请确保在两个编译器下明确定义结构的打包。

答案 1 :(得分:0)

DLL访问驻留在调用应用程序堆上的内存是完全合理的。如果你不能这样做,那么DLL本来就没用了。

你的问题必须在别的地方。很可能你没有正确设置正确调用DLL的参数。

答案 2 :(得分:0)

你能否交叉检查GCC和DLL约定VS2kSP1 CLR的调用约定标志

答案 3 :(得分:0)

堆不属于某个函数。在模块中分配内存并将其传递给另一个模块是完全正常的,只需确保分配内存的模块是释放它的模块。
第二个麻烦来源可能是不同的呼叫转换。为所有导出的函数指定调用约定。