help! 不解!!!关于显示调用dll的问题!!!强烈建议高手请进!!!

JAVA3 2002-12-24 12:14:43
我使用这种方式定义,调用执行一切正常
typedef double (*LPSquareRoot)(double);

而我使用这种方法定义(这个可是原版抄msdn上的定义方法)
typedef double (CALLBACK* LPSquareRoot)(double);

调用执行也正常,可是执行完退出的时候,出现了访问冲突的错误。

请问怎么回事啊,加了CALLBACK之后 VC到底做了什么?
...全文
14 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2002-12-26
  • 打赏
  • 举报
回复
如 force_eagle(战鹰) 所说。其实无论你采用何种调用方式,必须保证函数
的定义和调用函数时所用的方式一致才可以。
finix 2002-12-25
  • 打赏
  • 举报
回复
en~~~~~
agree
JAVA3 2002-12-24
  • 打赏
  • 举报
回复
我不是来问怎样执行正确的,因为我说了,我使用
typedef double (*LPSquareRoot)(double);时
Everything is ok!

只有加了callback才在执行完后出错。我只想只知道为什么
ColderRain 2002-12-24
  • 打赏
  • 举报
回复
换成这样试试:

typedef double (WINAPI* LPSquareRoot)(double);
功名半纸 2002-12-24
  • 打赏
  • 举报
回复
写标准DLL调用函数,最好是采用C方式编译,而调用方式最好使用__stcall,其他方式也没什么关系:
extern "C" __declspec(dllexport) double __stdcall SquareRoot (double dParam)

调用时申明函数指针
typedef double (__stdcall * LPSquareRoot)(double);
功名半纸 2002-12-24
  • 打赏
  • 举报
回复
调用方式的问题!退出后没有完整清除栈;
调用方式和在DLL中你声明函数的方式要一致!
CALLBACK 调用方式和__stdcall方式一样,被调用者负责清理栈;而__cdecl方式是调用者负责清理栈;可能是你的声明方式是__cdecl而CALLBACK调用造成了栈在调用后未清理!(VC++ 6)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧