2009-12-02 64 views
0

我写了一个C++ DLL,它使用Sybase的本机C库连接到Sybase数据库。我可以在C盘上构建和运行程序,其他人可以从C盘运行程序,并且一切正常。但在某些情况下,我的DLL和Sybase DLL都位于F驱动器而不是C驱动器上。在这些情况下,我的DLL显然无法加载Sybase DLL。从不同的驱动器号运行时,C++ DLL失败

我有点不清楚链接是如何工作的,但基于我的不完全理解,我最好的猜测是DLL的C驱动器位置是内置到最终DLL中的东西,这是导致它失败的原因当它从另一个驱动器号运行时。这听起来像一个合理的解释?任何其他原因,我的DLL将无法加载从另一个驱动器号运行时的Sybase DLL?任何想法如何解决这个问题?

编辑︰原来这是错误的问题,但它导致我在正确的方向。 Sybase DLL使用ini文件来确定数据库连接详细信息,并且我已将硬编码到C驱动器的路径。

回答

1

一般而言绝对位置不在DLL内部使用。只存储DLL的名称。

其中系统查找DLL文件的地方,这里descrived:http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx

虽然它是可能加载通过绝对路径的DLL - 与被称为运行时加载DLL一个techinique - 但我怀疑节目不多做所以。

+0

当DLL可能不存在或者可能无法加载时,运行时加载非常有用:例如,如果Sybase DLL可能已安装或未安装,程序可能会使用Sybase DLL的运行时加载。 – ChrisW 2009-12-02 20:56:47

+0

@ChrisW:是的,但即使如此,你很少使用绝对路径。 – EFraim 2009-12-02 21:04:50

+0

感谢您的链接。这帮助我排除了我原来的理论。原来,我在数据访问代码中有一个C驱动器的位置(一个ini文件)被硬编码。 – 2009-12-02 21:17:57

0

这是.net和F驱动器的网络驱动器?当您将.net exe复制到网络驱动器并尝试运行代码时,某些版本的Windows上存在一些安全问题。操作系统不会让它运行。我希望这是你的问题。

+0

不,这是一个调用C DLL的非托管C++ DLL。这不是代码访问安全问题。 – 2009-12-02 20:41:37

+0

我没有回答其他部分:不,F是分区,而不是网络驱动器。 – 2009-12-02 20:47:07

0

是您的DLL和Sybase DLL存储在PATH中的位置?

+0

Sybase DLL位于PATH中。我的DLL实际上完全位于不同的服务器上,但是使用完整路径和名称进行动态加载。加载我的DLL的可执行文件从PATH中的位置运行。 – 2009-12-02 20:46:16

相关问题