重命名DLL会导致使用它的代码崩溃

时间:2010-12-09 10:30:21

标签: c++ dll

我有一个用本机C ++编写的DLL。 Visual Studio项目名称为MyDll,它将编译为输出目录中名为MyDll.dll的文件。

编译完成后,我将其重命名为MyDll2.dll。 (这个例子看起来很傻,但我有充分的理由重命名它。)

用C ++ / CLI编写的第二个项目使用此DLL。

在编译时,此项目引用MyDll.lib(在编译MyDll时生成),以便能够使用在dll中定义的类。

在运行时,为了加载DLL,我调用LoadLibrary,传递文件C:\...\MyDll2.dll的完整路径(它实际上在同一个文件夹中)。它加载成功,如LoadLibrary的返回值所示。

在代码中第一次出现我使用DLL中定义的类(只是声明堆栈中的对象)时,它崩溃了SEHException(这些异常没有提供任何关于崩溃原因的信息...)

仅当我执行重命名步骤时才会发生这种情况。如果我将其保留为MyDll.dll并在该文件上调用LoadLibrary,一切正常。所以很明显是由于重命名。

任何想法为什么?我不允许重命名DLL吗?

(编辑:通过提供更多详细信息澄清)

5 个答案:

答案 0 :(得分:2)

构建dll时,链接器还会生成一个lib文件,用于在可执行文件中链接。此lib文件包含从中导入导出的函数和数据的dll-name。所以你的可执行文件中引用了最初的名字dll。

答案 1 :(得分:1)

为什么在加载后重命名DLL?在调用LoadLibrary之后,永远不应重命名DLL。我很惊讶操作系统甚至允许你这样做。

答案 2 :(得分:1)

  

在这种情况下,我将不得不重新编译以更改文件名

是的,在重命名DLL时必须更改LoadLibrary()参数。修复你的真实问题,听起来你根本没有检查LoadLibrary()的返回值。返回NULL时抛出Win32Exception。

答案 3 :(得分:1)

我同意埃德温的观点。 lib文件指向导出的函数,还包含编译时的dll名称。

答案 4 :(得分:0)

我不知道是否有人会在一年后阅读此内容,但为什么OP甚至LoadLibrary在重新命名dll时它已经静态链接了?这是两件不同的事情。我认为OP的应用程序由于缺少MyLib.dll而崩溃,静态链接后需要,而LoadLibrary与它无关,OP也可以省略MyLib2.dll的LoadLibrary,结果将完全相同。我唯一无法解释的是提到的未知错误。

相关问题