Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 创建向后兼容的静态链接DLL下拉列表_C_Visual Studio_Dll - Fatal编程技术网

C 创建向后兼容的静态链接DLL下拉列表

C 创建向后兼容的静态链接DLL下拉列表,c,visual-studio,dll,C,Visual Studio,Dll,我有一个基于C的DLL,几年前我为一个项目编写了这个DLL,它导出了一组定义API的函数。现在我需要重新编写这个DLL的内部结构,但保持API完全相同 DLL的用户使用了静态链接,他们不想或无法重新编译其可执行文件 我注意到导出函数的RVA是不同的。我的理解是,这意味着可执行文件将无法找到函数,除非它与更新的lib文件重新链接 在VS2017中是否有办法强制导出的函数使用特定的RVA?我检查了Microsoft LINK DEF文件格式,但没有看到其中的选项 即使有可能,修复RVA是否足以确保旧

我有一个基于C的DLL,几年前我为一个项目编写了这个DLL,它导出了一组定义API的函数。现在我需要重新编写这个DLL的内部结构,但保持API完全相同

DLL的用户使用了静态链接,他们不想或无法重新编译其可执行文件

我注意到导出函数的RVA是不同的。我的理解是,这意味着可执行文件将无法找到函数,除非它与更新的lib文件重新链接

在VS2017中是否有办法强制导出的函数使用特定的RVA?我检查了Microsoft LINK DEF文件格式,但没有看到其中的选项

即使有可能,修复RVA是否足以确保旧的可执行文件能够使用更新的DLL,或者是否存在使其无法启动的其他复杂性


谢谢。

如果用户在您的库中进行了静态链接,则该库不是DLL,不重新链接就无法进行插入替换。至少没有一些丑陋的黑客。旧的库函数已复制到可执行文件中,因此无法编辑可执行文件。如果不能重新编译或重新链接,那么从头重写可执行文件可能会更容易


如果可能的话,如果可执行文件根本没有加载DLL的代码,那么在新DLL中处理函数的地址就不会有任何效果。

当您将EXE模块静态链接到DLL时,您确实会链接到DLL的导入库(a.LIB),该库是在构建DLL时与DLL一起创建的。这与针对静态库进行链接是不同的,因为静态库也是.LIB文件,所以很容易混淆

您应该做的第一件事是使用诸如或您最喜欢的PE analyzer工具之类的工具,确定您的EXE模块是否具有所述DLL的导入条目。如果没有DLL导入条目,则可能已将EXE链接到一个静态库,如@HAL9000的回答所述。如果没有对EXE进行反向工程,最好的办法就是按照建议的方式重建模块(如果可能)

否则,如果您确实找到了所述DLL的导入,则可以调出新构建的DLL,前提是您具有与原始DLL相同的导出(函数)名称和/或序号值。DLL通过导出名称和/或序数值查找函数,而不是RVA,在本例中,RVA只是一个内部细节。无论DLL是在进程(EXE)初始化期间(在调用EXE入口点之前)隐式加载(来自静态链接)还是显式加载(通过使用LoadLibrary的代码等),DLL的全部意义在于它是一个模块,设计为动态替换,Windows是围绕这一概念设计的。EXE(引用DLL)和DLL本身中的内部RVA不需要匹配旧DLL的值;此簿记由Windows加载程序在也称为运行时链接的过程中自动处理

如果EXE与所述DLL链接,并且还为DLL的导出函数指定硬编码地址(RVA)(一个称为静态绑定的过程),Windows仍将验证地址是否仍然在内部反映实际加载的DLL中的正确值,该值可能是不同的、更新的DLL。这是通过DLL导入部分中的时间戳检查完成的。如果存在不匹配,Windows加载程序将抛出所有静态RVA,并使用当前值更新它们,从而导致轻微的性能损失,但程序仍将加载。FWWW用于执行静态绑定的BIND.EXE工具不再使用VisualC++工具集,因为Windows的现代版本中的性能增益很小。这种优化曾经是加速加载时间的常见做法,特别是在操作系统提供的系统DLL中,但不应以这种或那种方式影响您正在尝试的操作