c - DLL 调用时堆/堆栈损坏

标签 c visual-studio-2008 gcc

我正在尝试在Codeblocks(在mingw下使用GCC)中使用Visual Studio 2008 SP1创建的dll(启用了公共(public)语言运行时支持)。传递给 dll 的一些参数已由调用函数动态分配。我的问题是:

“传递给 dll 的参数能否驻留在调用函数的堆上。这样做安全吗?”

从 dll 返回时,调用函数的堆栈被损坏,并且在尝试访问这些堆栈时,当我尝试调试此问题时,我在代码块内收到 SIGTRAP。

这可能是什么原因?

dll函数的原型(prototype)如下:

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。我在 stackoverflow 上的各个线程中看到过此类问题的讨论,但尚未找到具体的解决方案。

最佳答案

我建议您使 DLL 接口(interface)尽可能扁平;即避免传递结构,即使它们是 POD。由于您使用的是 2 个不同的编译器,这一点尤其重要。如果您决定传递结构,请确保在两个编译器下显式定义结构的打包。

关于c - DLL 调用时堆/堆栈损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6829392/

相关文章:

取决于 gcc 开关的条件代码

CUDA - 如何返回未知大小的结果

c - 不兼容的指针类型和返回使得整数没有强制转换问题

c - 64 位机器上的结构对齐

c++ - VC++ 项目,想在另一个 IDE 中编译但缺少某些东西

visual-studio-2010 - 将 VS 2008 解决方案移至 VS 2010 时,自定义属性不一致错误

visual-studio-2008 - 为 TFS 上的 checkin 策略强制执行自定义 stylecop 规则

C++ : Ask user input without pressing enter using assembly?

c++ - 从 C++ (gcc) 连接到 PostgreSQL

c - 如何在 Eclipse CDT 中查看和修改静态变量和全局变量