我用BCB生成了一个dll,在dll当中定义了两个类(没有声明导出)和一个导出函数,实际是封装了一些XML操作。为简单起见,简化说明如下:这两个类是继承关系,一个名为Base,基类,只有虚的公有函数,无成员变量。另一个继承自Base,为其派生类,名为Creature,重载了那些虚函数,并且增加了自己的成员变量。导出函数Base * InitializeFile()的作用是new出一个Creature的对象,初始化成员变量,并返回该对象指针,但作为基类的指针返回。
调用该DLL的程序头文件中,仅有Base类的声明,通过调用唯一的导出函数,得到一个Base类指针,当用这个指针调用相应函数时,实际使用的是Creature类中重载过的函数。
使用BCB生成的应用程序调用该DLL(静态调用),一切正常。
使用VC生成的应用程序调用该DLL(静态调用,有正确的lib文件),InitializeFile()函数返回的Base类实例指针正常,但使用它的成员函数时出错,跟踪进去看,发现能进入对应的Creature类实例重载后的函数,但是Creature的成员变量变成没有初始化过的了!于是出错。
不明白原因,希望各位大虾帮帮我,感谢先,任务急啊!
调用该DLL的程序头文件中,仅有Base类的声明,通过调用唯一的导出函数,得到一个Base类指针,当用这个指针调用相应函数时,实际使用的是Creature类中重载过的函数。
使用BCB生成的应用程序调用该DLL(静态调用),一切正常。
使用VC生成的应用程序调用该DLL(静态调用,有正确的lib文件),InitializeFile()函数返回的Base类实例指针正常,但使用它的成员函数时出错,跟踪进去看,发现能进入对应的Creature类实例重载后的函数,但是Creature的成员变量变成没有初始化过的了!于是出错。
不明白原因,希望各位大虾帮帮我,感谢先,任务急啊!
现在经过调试,发现问题在于:返回的Base类实例指针的值,和进到成员函数中看到this的值不一样,变成一个毫无关系的内存地址。正确的情况应该是一样的,怎么会是啊?而使用BCB生成的应用程序调用该DLL(静态调用),一切正常。
所以,或者动态调用(使用LoadLibraray和GetProcAddress);
或者使用Lib.exe重新生成VC的LIB文件。
class Base
{
public:
virtual void Func1(){}
...
}
导出函数Func1:
extern void WINAPI Func1(Base* ptr);
函数体:{ptr->Func1;}
这样就把Base类的成员函数调用交还给了BCB,就没问题了。
extern void WINAPI Func1(Base* &ptr);
或者 这个函数:
extern Base* WINAPI Func1();
class Base
{
public:
static void Func1(Base* &ptr);
...
}
你都试一下很好玩的。