社区
API
帖子详情
vb调用c的dll后出现内存不能读写的错误??
summy_0201
2004-12-23 11:29:55
在一个模块里声明了dll函数,并写了funtion,在其中调用了dll函数,并在主程序中调用了funtion,调试时调用dll函数时抱错“dll调用约定错误”,编译后,运行程序无此错误,但抱程序错误“内存不能读也不能写”?可以认定dll函数调用成功了,这是怎么回事啊?该怎么解决?
...全文
320
6
打赏
收藏
vb调用c的dll后出现内存不能读写的错误??
在一个模块里声明了dll函数,并写了funtion,在其中调用了dll函数,并在主程序中调用了funtion,调试时调用dll函数时抱错“dll调用约定错误”,编译后,运行程序无此错误,但抱程序错误“内存不能读也不能写”?可以认定dll函数调用成功了,这是怎么回事啊?该怎么解决?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
summy_0201
2004-12-27
打赏
举报
回复
没办法了,我暂时在调用过dll后 On Error Resume Next了一下,问题解决。谢谢各位了。
asmgirl
2004-12-25
打赏
举报
回复
gz
blueice12
2004-12-24
打赏
举报
回复
方法1 : 调用那个函数完毕后,自己修复堆栈。
其实C调用和stdcall调用的差别就在于,c调用是调用者恢复堆栈,而stdcall是被调用者恢复堆栈。而VB在调用所有的dll函数的时候都是采用stdcall的方式。见下面的示意代码:
StdCall :
push arg2
push arg1
call func
这就是stdcall方式调用 func( arg1,arg2 )的代码
CCall:
push arg2
push arg1
call func
add esp,8
多出来的一句就是恢复堆栈的代码,注意,只要让esp + 4 * 参数个数,堆栈就可以恢复。
这样就需要在VB里面插入机器码来直接操作esp寄存器,具体如何插入汇编代码可以参看网上的文章。因为只是插入一句代码,所以也可以静态修改编译出的文件来实现。
方法2: 自己用VC重新包装那个dll,也就是在VC里面定义一个新的函数:
__stdcall func( arg1, arg2 )
{
oldfunc( arg1,arg2 );
}
这里要注意,oldfunc要声明为 cdecl约定的,然后把这个源文件编译成一个obj文件,连接到VB工程中。
当然,重新封装一个dll也是可以的,但是那样发布的时候就需要发布两个dll了,有点太麻烦。
qiqi5521
2004-12-23
打赏
举报
回复
//dll我是改不了的,是第三方的dll,我要在vb里用里面的函数!
如果这个DLL的函数不是 _stdcall ,那么最好不要用,即使勉强能用,但实际上会破坏系统堆栈的平衡
http://community.csdn.net/Expert/topic/3654/3654315.xml?temp=.1760675
summy_0201
2004-12-23
打赏
举报
回复
但如果我编译执行程序,则不会出现“dll调用约定错误”,而且dll函数调用成功啊,但是vb会提示“未设置对象变量”??肯定是一调用了dll函数,便会这样的,程序代码本身没问题啊!能告诉我怎么回事啊?被这个查不出来的错误快逼疯了!!
下面是dll的.h文件里的开头内容:
#ifdef __cplusplus
extern "C" {
#endif
这个就是那个调用声明吗?我不太懂,这是vb能调用的模式吗?如果不行,要怎么办?dll我是改不了的,是第三方的dll,我要在vb里用里面的函数!
marckle
2004-12-23
打赏
举报
回复
用c写的dll,调用约定要改成__stdcall,而不是却省的_cdecl*方式。
VB
中
调用
VC++创建的
DLL
资源文件全攻略
本文介绍了在
VB
中
调用
VC++编写的
DLL
资源文件的方法。先阐述了
VB
与
DLL
协作的优势,接着详细说明了VC++创建
DLL
工程的步骤,包括接口设计、项目设置等,还介绍了
DLL
资源文件的添加与管理、导出函数的编写,最后讲解了
VB
调用
VC++
DLL
资源文件的具体方法及跨语言
调用
的优化策略。
VC客户端
调用
VB
DLL
的实践教程
本文是VC客户端
调用
VB
DLL
的实践教程,介绍了跨语言编程的必要性,阐述了
DLL
在Windows系统中的作用,详细说明了
VB
DLL
的创建、函数导出过程,以及VC中引用和
调用
VB
DLL
的步骤,还提及了函数
调用
接口、
调用
约定、类型匹配、
错误
处理和资源释放等关键问题。
VB
出现
“找不到DAO350.
DLL
”
错误
本文介绍了解决因卸载软件导致的
DLL
文件丢失问题的方法,包括重新下载并注册
DLL
文件的过程,以及如何使用regsvr32命令进行注册。
VB
等语言与C++
DLL
的通讯
本文详细探讨了
VB
、Pascal和Fortran如何
调用
C++编译的
DLL
,重点讨论了函数
调用
约定和名字修饰的影响。通过例子展示了不同语言之间的
调用
约定差异,如C++中的__stdcall和名字修饰,以及如何在
VB
中使用别名或DEF文件来模拟PASCAL约定。还涵盖了字符串和数组的传递,以及使用AddressOf存储函数指针的方法。
VB
.NET基础之
DLL
本文围绕
VB
.NET中的
DLL
展开,介绍了
DLL
是动态链接库,用于共享和更新。阐述了
DLL
文件的定义、分类(如ActiveX、CPL、DRV文件)、特点、依赖项等。还说明了
DLL
的使用方法,包括链接、入口点、导出等,最后提及了
DLL
故障排除工具。
API
1,488
社区成员
23,270
社区内容
发帖
与我相关
我的任务
API
VB API
复制链接
扫一扫
分享
社区描述
VB API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章