我的dll 里有一个可被外部调用得函数dllFunc(TimeStruct* info);
TimeStruct是我在dll里定义的一个结构。我在程序里调用dllFunc()时出错(是在运行时),错误如下:
Debug Error!
Program:E:\testtimer\Debug\testtimer.exe
Module:
File:i386\chkesp.c
Line:42the value of ESP was not properly saved across a function call.This is usually a result of calling a function declared with one calling covention with a function pointer declared with a defferent calling convention.(Press Retry to debug the application)我在调用时也传了TimeStruct类型的指针过去,可就会出这样的错误
很奇怪,我在调用没有参数的dll里的函数没有错,

解决方案 »

  1.   

    人家说得很明白,很有可能是你DLL内部申明与在调用程序中的申明不一致引起的
      

  2.   

    我是把dll里面对结构的声明哪部分代码粘贴到应用程序中的,连名字都一样,为什么?
      

  3.   

    微软
    说的
    DLL导出函数的参数最好不是指针,也别是引用
    不过,
    你试一下
    把参数类型改成远指针( 如果不想改太多的话 )
      

  4.   

    ALT-F7
    选中C/C++
    CATEGORY选择
    CODE GENERATION
    CALLING CONVENTION中的选项
    应用程序和动态库的该选项设成一样的
    重编译
    试一试
      

  5.   

    to mmm1122:
    一样,可还是不行是不是我不能在程序声明 这个struct,而是应该从dll里引出这种结构?
      

  6.   

    我猜想应该是你的动态库导出函数的声明和动态库导出函数的使用时调用类型不一致。
       具体的设定检查同mmm1122(蒙) 的相同。解释:
       在dll工程和exe工程中,有一个设定函数调用类型的操作,其设定是为了确定调用函数返回时参数的压栈出栈的处理。具体的来说就是_stdcall和_cdecl及_fastcall的区别。   通常在dll动态库导出函数声明时需要定义,在别处使用时用到这个定义。
    例如:
    dll:声明:
    int _stdcall func();exe:声明:
    int _stdcall func();
      

  7.   

    参数别传指针了
    函数原型重新改写一下远指针
    是win3.1下编程时用过的
    现在是32位了
    刚刚试了一下,已经没有远指针了
      

  8.   

    可我还想通过dll改应用程序里的TimeStruct类型的变量呢?不传指针怎么做,
    难道让函数返回这个结构的变量吗?
      

  9.   

    可以传结构指针的,注意函数的定义和声明,按照这样定义:
    extern "C" __declspec(dllexport) int func(...)
    {
        ...
    }调用声明:
    extern "C" __declspec(dllimport) int func(...);应该不会出问题
      

  10.   

    dll导出的函数和调用的声明不一致c语言里的调用  cdecl stdcall 是有区别的,确省的调用方式是cdecl,主要的区别在于参数的压栈,和调用后堆栈的清除工作,不同的调用是有区别的
      

  11.   

    建议查看以下数据对齐格式是否相同,在DLL导出函数使用结构参数时这很有用。
      

  12.   

    tuyang 的回答是对的我以前也碰上过样的问题
    后来就发现原来是调用类型申明的不对
      

  13.   

    对,你看看是不是类型不对,注意你用__stdcall什么的话,一定要对应