2009-12-02 63 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

相關問題