2009-11-24 49 views
1

我在我的DLL中有一个抽象类。我可以在没有重新编译exe文件的情况下更改dll界面吗?

class Base { 
    virtual char * First() = 0; 
    virtual char * Second() = 0; 
    virtual char * Third() = 0; 
}; 

这个动态库和这个接口用了很长时间。 我的代码中存在我的错误。现在我想改变这个接口

class Base { 
    virtual const char * First() const = 0; 
    virtual const char * Second()  = 0; 
    virtual  char * Third() const = 0; 
}; 

一些EXE程序使用我的DLL。 EXE程序是否可以在不重新编译的情况下工作? 独立考虑每个新界面行中的更改。

说明:当然,EXE程序不会改变函数的结果。

回答

1

它“不应该”的工作,但你永远不知道你的运气。

由于超载,char *First()const char *First() const是不同的功能。你可以在同一个班上都有。因此,任何名称修改计划都必须将它们映射到不同的名称,这在绑定时显然是一个问题。

但是,这些是虚拟调用,并且您有三个函数被相同顺序的等价物替换。我不知道MSVC的vtable方案的任何细节,特别是偏移是静态确定还是动态绑定。如果前者,exe文件可能会绑定新的vtable。函数指针可能恰好如此,因为调用约定不依赖于cv-qualification(即,const char*以与char*相同的方式返回,并且const以与non-const相同的方式传递,这是)。

即使它工作,我也不想依赖它,除非它是MS专门解决和保证的东西。

+0

你写的“调用约定不依赖于cv-qualification”。就是那个问题。这样对吗? – 2009-11-24 14:15:04

+0

这是用于Win32的。 'this'在ECX中传递,无论它是否为const,并且EAX中有一个'char *'return,无论它是否为const。但仅此不足以使绑定工作。正如我所说我不知道​​MSVC的vtable,并且我也不知道Win64调用约定(如果你有一个64位版本)。 – 2009-11-24 14:22:41

+0

为什么只有第四个人理解我的问题? - 修辞。 – 2009-11-24 14:26:11

0

因为你改变你的界面,你必须重新编译(我认为)

0

可能不会工作。虽然最容易知道的方法是尝试并看到

+0

未来如何?当我将VS2008改为VS2010,VS2015,VS2137时。 – 2009-11-24 12:39:11

+0

建议尝试使用+1 – ChrisF 2009-11-24 12:39:37

+6

我不认为尝试是正确的方法。它可能工作,或者它可能会悄悄地垃圾其他数据。 – EFraim 2009-11-24 12:44:09

3

您的EXE可能会改变功能的结果,因为它是char*。现在是const char*。根据C++标准7.1.5.1/3-4,更改const对象将导致未定义的行为:

对cv限定类型的指针或引用不需要实际指向或引用cv限定对象,但它被当作是对待的;即使引用的对象是非常量对象,并且可以通过其他访问路径进行修改,也不能使用const限定的访问路径来修改对象。 [注意:cv-qualifiers是由类型系统支持的,所以它们不能被转换(5.2.11)。 ]

除了声明为mutable的任何类成员(7.1.1)可以修改外,任何尝试在其生命周期(3.8)中修改const 都会导致未定义的行为。

+0

EXE程序不会更改函数结果。 – 2009-11-24 12:42:08

0

我不认为这会奏效。更改DLL的接口通常需要重新编译链接到它的可执行文件。

此外,您可能需要更改可执行文件中的代码,因为您已更改功能签名。最后,如果你要更新/追加一个接口,你最好是继承原始接口。这将防止任何现有的代码中断。

相关问题