2010-12-09 36 views
1

我有一个用本地C++编写的DLL。 Visual Studio项目名称为MyDll,它编译为输出目录中名为MyDll.dll的文件。重命名DLL会导致使用它的代码崩溃

编译后,我将它重命名为MyDll2.dll。 (这个例子看起来很愚蠢,但我有一个很好的重命名的理由。)

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

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

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

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

这只会发生,如果我做了重命名的一步。如果我将它保留为MyDll.dll并在该文件上调用LoadLibrary,则一切正常。所以这显然是由于重命名。

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

(编辑:通过提供更多的细节澄清)

+1

您的应用程序是否具有该DLL的句柄(使用Procexp来说明)? – Benoit 2010-12-09 11:00:59

回答

2

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

1

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

+0

我不知道。在编译完成之后,我将它重命名,然后再运行任何东西。 – Laurent 2010-12-09 14:01:30

1

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

是你做的,在调用LoadLibrary()参数必须当您重命名DLL改变。解决你真正的问题,听起来你并不像检查LoadLibrary()的返回值。当它返回NULL时抛出一个Win32Exception。

+0

很明显,参数是DLL的实际名称......它加载正常,我检查返回值,这表示成功。但是稍后当我使用DLL中的类时,它会因SEHException而失败。 – Laurent 2010-12-09 14:03:17

1

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

0

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