我的DLL中有一个抽象类。
class Base {
virtual char * First() = 0;
virtual char * Second() = 0;
virtual char * Third() = 0;
};
这个dinamic库和这个界面使用了很长时间。 我的代码中有错误。现在我想改变这个界面
class Base {
virtual const char * First() const = 0;
virtual const char * Second() = 0;
virtual char * Third() const = 0;
};
某些EXE程序使用我的DLL。 EXE程序是否可以在不重新编译的情况下工作? 单独考虑每个新界面的变化。
注意:当然,EXE程序不会改变功能结果。
答案 0 :(得分:3)
您的EXE可能会更改功能结果,因为它是char*
。现在是const char*
。根据C ++标准7.1.5.1/3-4更改const对象将导致未定义的行为:
对cv限定类型的指针或引用实际上不需要指向或引用cv限定的对象,但它被视为具有;即使引用的对象是非const对象并且可以通过某些其他访问路径进行修改,也不能使用const限定的访问路径来修改对象。 [注意:类型系统支持cv-qualifiers,因此在不进行强制转换的情况下不能破坏它们(5.2.11)。 ]
除了可以修改声明为mutable(7.1.1)的任何类成员之外,任何修改const的尝试都是如此 对象在其生命周期(3.8)中导致未定义的行为。
答案 1 :(得分:1)
它“不应该”有效,但你永远不知道你的运气。
由于超载,char *First()
和const char *First() const
是不同的功能。你可以在同一个班级。因此,任何名称修改方案都必须将它们映射到不同的名称,这在绑定时显然是个问题。
但是,这些是虚拟调用,并且您有三个函数以相同的顺序替换为它们的等价物。我不知道MSVC的vtable方案的任何细节,特别是偏移是静态确定还是动态绑定。如果是前者,exe可能会绑定新的vtable。函数指针可能正常工作,因为调用约定不依赖于cv-qualification(即const char*
以char*
的方式返回,并且const传递与非常规相同的方式是这样的。)
即使它确实有效,我也不想依赖它,除非它是MS专门解决和保证的东西。
答案 2 :(得分:0)
因为你改变你的界面,你必须重新编译(我认为)
答案 3 :(得分:0)
可能不起作用。虽然最简单的方法就是尝试并看看
答案 4 :(得分:0)
我不认为这会奏效。更改DLL的接口通常需要重新编译链接到它的可执行文件。
此外,您可能需要更改可执行文件中的代码,因为您已更改了功能签名。
最后,如果要更新/附加接口,最好是继承原始接口。这将阻止任何现有代码中断。