2012-10-12 44 views
0

我的代碼使用的庫是一個靜態/隱式鏈接的DLL(我們稱之爲DLLB),但在運行時找不到它。最佳方式來幫助窗口找到我鏈接到的DLL?

儘管將DLLB與調用它的代碼放在同一個目錄中, (調用代碼本身就是一個DLL,它是從python調用的DLLA,它是從arcpy調用的,我不太清楚爲什麼python會發現DLLA很好,但是DLLA沒有找到DLLB,儘管它們在同一個目錄中) 。

如果我把庫DLL放在系統路徑的某個地方,一切正常。

但是部署的最佳方法是什麼?在安裝時向客戶機上的系統路徑添加條目?在加載DLL之前,在運行時從python修改系統路徑?還有別的嗎?

回答

3

Python必須在LoadLibrary調用中指定DLL的完整路徑。這是推薦的做法。如果只指定模塊名稱,則可能會加載錯誤的DLL,可能會引入binary planting vulnerability

請注意,儘管默認搜索路徑包含可執行文件的加載目錄,但它不包含從其他DLL加載的目錄。所以你看到的行爲和預期的一樣。

如果您可以使用動態加載,則可以查找DLLA的路徑並使用它來構建DLLB的路徑。

要獲取DLLA的模塊句柄,請致電GetModuleHandleEx。要從模塊句柄中獲得DLLA的完整路徑,請致電GetModuleFileName。檢查最後一個元素是否是DLLA.dll,並將其替換爲DLLB.dll。然後你可以調用LoadLibrary。

+0

你說得對,我在Python中指定了DLLA的完整路徑。 DLLB是第三方庫,唉,我不認爲支持動態加載。這留下了什麼是最好做的問題 - 修改系統路徑?我可以以某種方式做到這一點只是爲了Python,它的DLL加載? –

+0

您可以隨時動態加載DLL。 (好吧,幾乎總是)。最可能的問題是,將DLLA中的代碼改爲使用顯式而非隱式加載可能太難了。我認爲最好的解決方案是在加載DLLA之前從Python *顯式加載DLLB。然後隱式加載將找到正確的DLL,因爲它已經在內存中。但是,您可以使用'os.environ'映射對象修改該進程的PATH環境變量。您可能想要將目錄預先設置爲PATH,但要確保沒有任何內容會發生衝突。 –

+0

啊哈! http://msdn.microsoft.com/en-us/library/784bt7z7%28v=vs.100%29.aspx –