在一个程序中调用一个dll。在调用这个dll的一个函数的时候出现stack overflow 。 这个函数的调用是通过调用程序的一个定时函数执行的。( 在一般的程序中可以通过调整应用程序的栈的大小解决这个问题。一个试验成功。) 但是好像stack与线程有关。那么在vc中我如何调整这个项目的stack大小。是在调用程序中调整还是在dll的程序中调整呢。(就是调整setting中的选项)。 第二个问题就是在这个如果stack和线程有关,那么我起定时函数的时候就是起了一个线程,我怎么调整这个线程的栈大小呢。 用的是这个定时函数timeSetEvent()  。???

解决方案 »

  1.   

    在createthread中有个参数,就是用来设定stack大小的,默认是1m。
      

  2.   

    那个DLL肯定有问题,很可能是这样的语句造成的:
    double n[0x1000000];
      

  3.   

    我是在这个函数中抛出 stack overflow 的。
    定义在_bstr_t 中
    inline _bstr_t::Data_t::Data_t(const char* s) throw(_com_error)
    : m_str(NULL), m_RefCount(1)
    {
    m_wstr = _com_util::ConvertStringToBSTR(s); if (m_wstr == NULL && s != NULL) {
    _com_issue_error(E_OUTOFMEMORY);
    }
    }
      

  4.   

    LINK选项中有将堆栈调大的选项还有你上面的程序是inline的,所以造成原因的是调用它的那个函数中
    的堆栈有问题,你看看你的参数中才四个字节,怎么会溢出呢?
      

  5.   

    上面的函数是vc提供的_bstr_t 类。
    我只是调用
    在这一句有问题。 m_wstr = _com_util::ConvertStringToBSTR(s);下面是callback stack的内容:
    $$$00001() line 79
    _bstr_t::Data_t::Data_t(const char * 0x000b2f64) line 504 + 9 bytes
    _bstr_t::_bstr_t(const char * 0x000b2f64) line 220 + 88 bytes
    还有一个问题是:
    假如如楼上所说在我的程序中没有溢出,那么我修改link下的stack参数,就没有用处吗。这个参数不能影响我的整个程序吗。  难道不能解决这个溢出的问题!
      

  6.   

    所有的局部变量空间都会由编译器在“{”之前预留的,虽然编译器可以做到什么时候定义什么时候使用,但这不是二进制的标准,比如:
    int main(int argc, char* argv[])
    {

    __asm mov [ebp - 4] , 65
    char p ;
    p = 'A';
    printf("%d\n" , p );
    return 0;
    }
    第一句,其实完成的是第三句的功能,空间是预留的.第一句和第三句是可以随便只要一句的.
      

  7.   

    但是如果改成这样:
    int main(int argc, char* argv[])
    {
    //  p = 'A'; 有错误
    char p ;
    printf("%d\n" , p ); // 这里的p是一个未经过初始化的数据
    return 0;
    }
    就连编译都通不过。