重新编译MFC扩展DLL会更改导出函数的入口点
Recompiling MFC Extension DLL changes entry points of exported functions
我有一个MFC扩展DLL,它导出一个C++类,我需要修改类方法的行为。这些更改不会影响类的方法的签名。
我不想重新编译使用该库先前发布版本的"lib"文件的模块。
如果更改修改了函数的入口点地址,会发生什么?
例如,构造函数的地址发生了更改:
Export Ordinal Function Hint Entry Point
[+ ] 3 (0x0003) 2 (0x0002) ??0CLangManager@@QAE@XZ 0x00009CB0 (OLD DLL)
[+ ] 3 (0x0003) 2 (0x0002) ??0CLangManager@@QAE@XZ 0x00009760 (NEW DLL)
我应该重新编译使用库的模块吗?
我使用发布的可执行文件测试了重新编译的库(带有新的入口点),一切都很好。我不确定这种情况是否隐藏了一些副作用。
何时需要重新编译链接到DLL的可执行文件
二进制兼容性何时被破坏
这是使用DLL的好处之一-您可以更改它,只要您继续保持相同的函数签名,一切都会正常工作。链接发生在程序加载时,因此地址的更改没有任何区别。
你需要绝对肯定的是,DLL中定义的任何类都没有任何内联方法,因为这些方法可能不适用于对象的任何内部更改。
当函数签名发生更改,或者当公共成员变量在对象中的位置发生更改时,二进制兼容性将被破坏。我会完全避免DLL中的公共成员变量。
编辑:正如评论中所指出的,如果在类中添加或删除变量,从而改变其大小,也可能会遇到麻烦。如果对象是在DLL之外创建的,无论是作为局部变量还是通过new
创建的,这都会成为一个问题。您可以通过从DLL内部创建所有对象实例并将指针传递给调用方来避免这种情况。您还可以通过在类中使用PIMPL习语来避免问题。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 修改程序的入口点时未调用全局变量的构造函数
- 函数声明中的 WINAPI 标识符C++ DLL 入口点函数中的标识符
- P/调用,查找/声明函数入口点时遇到问题
- 如何从c++中的静态线程入口点函数调用其他函数
- 许多函数的单个DLL入口点
- DllMain 中钩子回调函数的入口代码是什么
- 如何告诉link.exe使用wmain作为入口点.LNK2019:函数__tmainCRTStartup中引用的未解析外
- 使用OpenCV和VLC SDK的函数入口点出现奇怪错误
- 重新编译MFC扩展DLL会更改导出函数的入口点
- 为什么要将左手矩阵和右手矩阵的入口点分开,而不是使用右手标志或转换函数