首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

VC8编译的库,在VC6编译的exe中产生运行时异常

2012-03-01 
VC8编译的库,在VC6编译的exe中产生运行时错误你好,我在VC8下写了一个动态库,其中有一个接口struct DLL_EXP

VC8编译的库,在VC6编译的exe中产生运行时错误
你好,

我在VC8下写了一个动态库,其中有一个接口
struct DLL_EXP IXYZ
{
public:
  IXYZ(){}
  virtual ~IXYZ(){}

public:
  virtual void func( std::string, int idx ) = 0;
};
IXYZ *g_itf = 0;
并提供了一个接口指针注册的函数
void DLL_EXP reg(IXYZ *itf)
{
  // 将itf保存.
  g_itf = itf;
}
其意图是要在库中用注册的接口指针调用注册接口的功能函数.
void invokeFunc()
{
  std::string str("abce");
  int idx = 100;
  if( g_itf != 0 )
  g_itf->func( str, idx );
}


在VC6下写了一个exe,其中实现接口IXYZ的所有功能,并将实现类的对象指针用函数reg进行了注册.
class CImp : public IXYZ
{
public:
  CImp(){}
  virtual ~CImp(){}
public:
  virtual void func( std::string, int idx )
  {
  std::cout << str << " " << idx << std::endl;
  }
};
......
CImp imp;
......
reg( &imp );

但在调用注册接口的功能函数时,参数全部都变成未初始化的值.
即在前面的g_itf->func( str, idx )处,
在进入func函数时,那个字符串参数中的指针为0xcdcdcdcd, 那个int型值参数值为0.

不知何故,望高人指点,不胜感激.

  unforgiving
  2008-07-05凌


[解决办法]
VC6和VC8的 std::string实现相差很大。
所以你得用const char*来做参数。
最好是一个版本的编译器编译出来的dll和exe

热点排行