dll库引用的问题Run-Time Check Failure #0

大板牙花生 2014-08-21 11:00:55
调用规则不同 该如何解决 提示代码
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
This is usually a result of calling a function declared with one calling convention with a
function pointer declared with a different calling convention.

网上搜了好多 看到比较多的是在函数定义前加_____stdcall 问题是 我引用的dll怎么修改呢?
并且这个是跨平台的,修改之后其他平台引用DLL会受影响。况且这么修改量太大。有没有什么诀窍呢?

我用的是VS2010。
...全文
175 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-08-25
  • 打赏
  • 举报
回复
引用 6 楼 wter26 的回复:
[quote=引用 5 楼 zhao4zhong1 的回复:] 《Unix编程艺术》
这本书慢慢才能看完 一下解决不了问题啊 我想的是在vs里面修改了调用规则为__stdcall了但是会出现新的错误,提示无效的外部引用, error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: static 看到有说是字符不一样的 我修改了字符格式,但依然不行 如果采用原来的调用方式__cdecl则可以顺利编译,只是运行的时候出错。。。。[/quote] 我回复《Unix编程艺术》的意思是: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·……
大板牙花生 2014-08-23
  • 打赏
  • 举报
回复
好吧 问题找到了 太丢人了。。。其实问题是 原来的函数是void function(var),但是我写成了function()。传入参数肯定错误了,太丢人了。。。谢谢zhao4zhong1 老师
大板牙花生 2014-08-23
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
《Unix编程艺术》
这本书慢慢才能看完 一下解决不了问题啊 我想的是在vs里面修改了调用规则为__stdcall了但是会出现新的错误,提示无效的外部引用, error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: static 看到有说是字符不一样的 我修改了字符格式,但依然不行 如果采用原来的调用方式__cdecl则可以顺利编译,只是运行的时候出错。。。。
大板牙花生 2014-08-22
  • 打赏
  • 举报
回复
引用 3 楼 Saleayas 的回复:
如果你是导出的函数,不管是否是跨平台,建议都是 __stdcall 的调用约定,没有什么原因。 使用 STDAPI 和 STDAPI_ 来定义。
引用 3 楼 Saleayas 的回复:
如果你是导出的函数,不管是否是跨平台,建议都是 __stdcall 的调用约定,没有什么原因。 使用 STDAPI 和 STDAPI_ 来定义。
不明白啊 。。。怎么用 那么多函数 一个个改吗
Saleayas 2014-08-22
  • 打赏
  • 举报
回复
如果你是导出的函数,不管是否是跨平台,建议都是 __stdcall 的调用约定,没有什么原因。 使用 STDAPI 和 STDAPI_ 来定义。
大板牙花生 2014-08-22
  • 打赏
  • 举报
回复
引用 1 楼 zhousitiaoda 的回复:
会出现这个还有可能是DLL没有及时更新,先确保导出的接口跟使用的DLL一致。如果真的是调用约定,那导出的接口用的什么约定使用的时候就申明什么约定。
我使用的跨平台的DLL,LIB。肿么办,好多函授 总不至于每个都这么定义吧。
赵4老师 2014-08-22
  • 打赏
  • 举报
回复
《Unix编程艺术》
zhousitiaoda 2014-08-21
  • 打赏
  • 举报
回复
会出现这个还有可能是DLL没有及时更新,先确保导出的接口跟使用的DLL一致。如果真的是调用约定,那导出的接口用的什么约定使用的时候就申明什么约定。

15,471

社区成员

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

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