传递string引用时出错

HDLee 2008-03-03 10:00:34
初始化好一个std::string对象, 调用一个其他dll的方法,接受这个string对象作为参数(传引用), 但是debug下,跟踪到dll的function中发现这个string对象显示为Bad Ptr, 但是对象地址还是原来那个, 很奇怪...

我的猜想是dll编译的时候使用的string类型定义跟我现在使用的不一样, 导致了这个run time的crash.

dll应该是在vc7.1下编译的,我目前使用的是vs2005,应该是vc8
...全文
400 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-03-04
  • 打赏
  • 举报
回复
LZ似乎没看到我2楼的回复啊,想解决问题就把你DLL中的函数定义贴出来。
  • 打赏
  • 举报
回复
很明显,string的实现是不同的,你如何重用?
不同编译器对同一段代码处理也不一定一样。

我曾经遇见这个问题,解决方案就是改接口。
做DLL的时候要时时刻刻想,这个接口假如是VB或者Delphi 调用的时候改如何写
这样DLL才有通用性。
HDLee 2008-03-04
  • 打赏
  • 举报
回复
楼上,为什么说这个string是无法使用的?请说详细点,虽然我也这么怀疑。
  • 打赏
  • 举报
回复
dll应该是在vc7.1下编译的,我目前使用的是vs2005,应该是vc8
=============================
这个string是无法使用的,只能改接口。
HDLee 2008-03-04
  • 打赏
  • 举报
回复
在dll接口不能更改的前提下,我该怎么做呢?
HDLee 2008-03-04
  • 打赏
  • 举报
回复
好的,谢谢了

事实上,我察看了内存布局和debug时的信息之后,把caller的参数指针+4后再call dll function,这个问题就解决了。不过显然这个不是一个好的解决方法
  • 打赏
  • 举报
回复
最好的办法是改接口
其他的办法就是使用和dll提供者一样版本的编译器。(这个也不一定能解决问题,试试吧)。
HDLee 2008-03-04
  • 打赏
  • 举报
回复
那现在就是说出了我改用vc7,就没有别的办法了?
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 akirya 的回复:]
很明显,string的实现是不同的,你如何重用?
不同编译器对同一段代码处理也不一定一样。

我曾经遇见这个问题,解决方案就是改接口。
做DLL的时候要时时刻刻想,这个接口假如是VB或者Delphi 调用的时候改如何写
这样DLL才有通用性。
[/Quote]
注意红色的部分
HDLee 2008-03-04
  • 打赏
  • 举报
回复
void loadConfig(string& path);

接口没什么特别的,dll不是我写的,也改不了

to 8楼,是不是说vc7与vc8之间string的定义有过改变导致了这个问题?
arong1234 2008-03-03
  • 打赏
  • 举报
回复
貌似跨模块传递这种对象需要进行模块上下文切换得
AFX_MANAGE_STATE?
jameshooo 2008-03-03
  • 打赏
  • 举报
回复
又是一个跨模块传递内存管理类的问题。
不要尝试越过模块边界传递内存管理类(如string、CString等等),应该转换成char*之类的标准数据类型再传递,每个模块都有属于自己的逻辑堆内存,一个模块中分配的内存在另一个模块看来是不存在的(无效的),每个内存块都有模块标记,系统会比较分配和释放时的模块是否相同。另外一个隐患是,不同模块使用的内存分配器可能是不一样的,所以必须维持一个原则,模块分配的内存必须由自己释放。换句话说,所有内置内存管理的封装类都不要作为参数跨模块传递。
cnzdgs 2008-03-03
  • 打赏
  • 举报
回复
看你的dll中的函数是怎么定义的。
可以先把调用程序中的dll函数声名为值类型参数试试(dll内部不变)。
HDLee 2008-03-03
  • 打赏
  • 举报
回复
突然想到可能是字节对齐的问题

15,471

社区成员

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

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