请教高手关于调用DLL中的函数引起的内存冲突问题?(100分)

A

acee

Unregistered / Unconfirmed
GUEST, unregistred user!
当我在比较大的程序中使用卡机函数(dll中的)时出现了以下错误:access violateion at address 100167A9(这个地址总是不变) in module 'MWIC_32.DLL' write of address 00600374(这个地址是变的)处产生异常,但只要在这个过程中放置断点的话,就能正常执行下去,屡试不爽,这使我感到非常奇怪。我是用DELPHI50开发的。如果我单独开启窗口调用卡机函数却没有任何错误。(另外我将卡机函数放在我写的DLL中时,一旦报执行到卡机函数处时也出现了以上问题),不知各位有无遇到这种问题,有何解决方法。
 
你能不能换换行。另外你讲了很多只有你自己明白的,卡机 DLL 是用 delphi 做的吗?
比较大的程序是什么概念,我们都不知道啊,你怀疑内存,那你做过内存方面的什么测试
吗?我们都不知道。需要更多的信息。
 
100167A9 估计是一个函数的地址,00600374 估计是一个没有提交的内存位置。
于是,估计 'MWIC_32.DLL' 是一个 C 做的 DLL ,更合理的估计是 DLL 想写
没有实际提交的 Delphi 堆内存,在断点条件下,调试程序帮它管理了,这样
你也可以模仿调试程序,给 Delphi 单元加上 ShareMem 单元。
 
调用DLL能正常工作吧?
应该是函数原型的问题
 
是否在线程里?
出错的语句是什么?
 
各位:你们好!那个DLL是用C做的,我也试过在引用的单元加上SHAREMEN,但这些都没有用,
我的所说的程序比较大是指我在主窗口中SHOW出一个子窗口,再在子窗口中调用这个DLL函数
时。最奇怪的是刚开始是可以的,但过了一段时间却不行了,且也不是在线程里。
谢谢各位解答!
 
调用约定是否正确?查看一下程序运行时内存的占用情况,
你有否循环调用,如果没有,何来"刚开始"和"过一段时间"之分,能否说的详细点
 
beyondair:
你好!
我用的是STDCALL的调用约定,且静态与动态加载DLL的方法均用过,也不行。
涉及到该DLL的调用都没有用到循环语句。一开始程度运行是完全正确的,但我也不知道
改动了哪里,就出现了上述问题,即使完全重头再来也不行,请指教!
 
指教不敢当,先把调用约定改成cdecl试试
还有个笨方法
你说开独立窗体调用可以,那就用一个独立窗体一点一点的扩展到你现在的程序,每扩展
一次都试试,看看问题出在哪一步
 
多人接受答案了。
 
各位好!
关于调用DLL中的函数引起的内存冲突问题是我已解决了,主要原因是由于该DLL中使用了
PCHAR的参数引起的,以前我用的是强制类于是转换,所以出了问题 ,这次用了STRALLOC()
和STRPCOPY(),STRNEW()将它们搞定了,十分爽!谢谢各位了。
另外我发现SHAREMEM与上面提到的三个函数有问题,如果引用了SHAREMEM的话,程序结束后会有
指针冲突。
acee today!
 
acee:
呵呵,我也曾遇到这个问题,
我是将所有的参数都定义为 SHORTSTRING后解决了此问题的,
 
顶部