VB.EXE错误 提示指令引用的内存不能为read
各位兄弟,最近用VB写了个测试系统,但是在调试过程中会出现内存不能被read或者write等对话框。
主要功能是:调用别人用C++写的DLL文件进行测试,由于测试要求同时测试很多台产品,所以我的程序中会在一个function里面同时读取6个文件夹下的DLL函数。
不知大家在调试的过程中有没有遇到过同样的问题
在网络上查到的关于PC机硬件的问题,我几乎都试过了,不管用。
目前猜到可能原因有两点:1.我调用的DLL有问题
2.VB代码中有bug。 典型的DLL函数应用问题,一般情况是DLL文件中的函数在VB中声明不正确所致。 你怎么不考虑一下你的操作系统有没有问题。 to 1楼
我调用的DLL文件中声明的函数应该是没有问题的,因为我在进行单台测试时,或者手动debug时,并不会出现这种不能被read的状况呀。。。。
to 2楼
我的操作系统已经换过N遍了,简体的繁体的,还有什么内存条之类的,都换过了
我能想到的,都被你试过了。。。不过有些情况是这样的
我就遇到过,EXE运行没有问题,但在调试环境下就是出错。原因是VC++写的DLL里面的函数没有加:stdcall
DLL文件是客人提供的,我并不能改变它的内容,也不知道里面是什么代码
您说的stdcall是什么东西?
DLL 的调用约定错误(错误 49)
传送给动态链接库 (DLL)的参数必须符合例程的需要。调用约定要检查个数、类型、参数的顺序等。此错误有以下的原因和解决方法:
程序调用被传递了错误的参数类型的 DLL中的例程时。
确保所有的参数的类型和调用的例程中指定的声明符合。
程序调用被传递了错误的参数数目的 DLL中的例程时。
请确保参数数目和所调用的例程的声明符合。
程序调用 DLL 的例程,但没有使用 StdCall 调用约定。
如果 DLL 例程需要的是按值参数,那么请在例程的声明中确保这些参数是以 ByVal 进行了声明。
对于Windows DLL的Declare 语句包括了 CDecl。
详细信息,可选取有问题的项目,并按下 F1 键。
daclare声明有问题,或者,调用时,参数有问题,代码贴出来看看 感觉像是DLL内部错误 不能为读,就是指针飞到了一个不可读的区域.相应地,不能为写,就是指向了一个不可写的区域.
copymemory byval 0&,byval 99&,1
你用这一句看看,会出现个什么错误.
这种错误在VB自己的代码里基本上无法出现,因为VB把内存,指针等操作封装得严严实实,失去灵活性的代价下让稳定性与安全性提到最高.
所以除非像上面那样自己读写内存及胡乱使用指针,VB自己是不会出错的.
建议你与DLL开发者商量一下,检查一下指针及内存操作中是否有问题.
如果自己没DLL代码,就只有跟踪一下了,推荐使用OllyDbg. 本帖最后由 bcrun 于 2011-11-20 11:37:18 编辑 这样吧,你做一个日志.
在每个API调用前及调用后,都输出日志到文件.
或者调用debugoutputsting函数输出日志,并使用dbgview程序查看日志.
当发现在哪一个函数的调用后返回前挂了,就可以确定是函数里面的问题了.
至于为什么会出问题,需要你与DLL编写者详细地沟通,比如当时的内存情况,CPU情况,硬件情况等细节.
你现在提供的信息基本上是无法让别人帮助你的,能帮助你的也只有给你提出缩小范围的方案而已.
补充:VB , 基础类