我可以在没有重新编译exe文件的情况下更改dll接口吗?

时间:2009-11-24 12:27:02

标签: c++ visual-studio-2008 dll abstract-class

我的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程序不会改变功能结果。

5 个答案:

答案 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的接口通常需要重新编译链接到它的可执行文件。

此外,您可能需要更改可执行文件中的代码,因为您已更改了功能签名。

最后,如果要更新/附加接口,最好是继承原始接口。这将阻止任何现有代码中断。