[问题] String内有未知内容,导致非法写入内存

楼主: f814030 (f814030买者会视接单数量)   2015-04-23 18:42:55
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
C++ builder XE7
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
厂商提供的dll
问题(Question):
#1 发表时间:2015-04-23 16:48:10 IP:211.72.xxx.xxx 订阅
各位先进好,
小弟使用软件版本为 c++ builder xe7
在淘宝买了某电子用品,而有附相关的dll来供我们二次开发,
但使用了dll 的function 之后,会回传一个 String 字串,但在bcb 里面只看到[ ????
],
个人清测是因为字码的关系,只要这个 String 变量结束后,系统要清掉时,就会跑出“
非法写入内存错误”,
试过想要把编码转换,但只要 String 变量的值赋于其它变量,系统也会出错…
请问这该如何处理呢?
谢谢。
作者: testPtt (测试)   2015-04-23 19:00:00
搞不好是xe7的问题
作者: rephansu (xanadu)   2015-04-23 19:08:00
dll接口是std::string?还是char*是怎么清掉变量?感觉这个指标直接丢弃就好
作者: LiloHuang (十年一刻)   2015-04-23 20:31:00
收到 wchar_t * 用 ::MessageBoxW(0, text, 0, MB_OK);先把内容印出来看看,如果内容正常代表有其他的问题通常由 DLL 配置的内存,都会有另一接口进行删除除非该回传的内存位置,没有想要让使用者进行删除因为不同的 DLL 可能有不同的 heap,通常不会这样删除当然这得看实作,其原因也可参阅 http://goo.gl/K4S2NP另外在 Windows 上非法写入就是 access violation其错误代码为 0xc0000005,也可用 SEH 或者 VEH 拦截
作者: rephansu (xanadu)   2015-04-23 21:08:00
感觉上是函式调用约定不对, 导致返回值指标不对这在接dll又不熟调用约定时很常发生错误触发时间点会是有呼叫dll函式的那个函式返回时
作者: LiloHuang (十年一刻)   2015-04-23 21:12:00
楼上说的也是有可能,__cdecl __stdcall 都加上去试试多数 DLL 开发接口,应该会提供对应的 header file然而有可能是 DLL 开发者没有将其详载于内部就是某些 DLL 可能是在被 unload 时才把该内存删除有可能该指标指到的字串是由 DLL 内部管理其生命周期而该接口只是提供一个 const wchar_t * 的返回值 ?建议可以用 dumpbin /exports 检查 calling convention不过这个是 VC 上的工具,我只有 VC2013 没办法帮你试话说 Visual Studio Community 2013 不用钱就可以用建议原 po 可以装来用用看 :) 祝顺利!忘了说你不是花钱买的吗? 应该会有售后服务吧 XD
作者: rephansu (xanadu)   2015-04-23 21:31:00
c++ builder默认是__fastcall , 你还可以试__cdecl说真的, 这问题还是问厂商比较快

Links booklink

Contact Us: admin [ a t ] ucptt.com