差異處
這裏顯示兩個版本的差異處。
java:jna:dll_search_path [2013/02/24 23:01] 127.0.0.1 外部編輯 |
java:jna:dll_search_path [2023/06/25 09:48] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | {{tag>java jna dll}} | + | |
- | ====== 呼叫DLL路徑的迷思 ====== | + | |
- | ===== 問題 ===== | + | |
- | 因為修Bug,碰到和load dll路徑有關的議題。這個問題是: 在class path中加入Native的dll位置,但程式卻去找system32中的dll檔。在詢問我的好朋友谷哥後,找到這篇文章[[http://msdn.microsoft.com/zh-tw/library/7d83bc18(VS.80).aspx|Windows 用來找出dll的搜尋路徑]]。\\ | + | |
- | 經過多個試驗,發現將dll放在jre的bin與java執行檔同目錄,就可以比system32中的提早搜尋到。於是我想到: 即使dll沒放在java執行檔的路徑下,但我是有在工作目錄下放過dll,為何還是去讀取system32呢? (在這的java執行檔指的是jre/bin/java.exe) | + | |
- | ===== 實驗 ===== | + | |
- | 我透過下面的實驗去確認找尋dll的順序。 | + | |
- | ==== Artifact ==== | + | |
- | ^名稱^關係^用途^ | + | |
- | |HelloWorld.exe|Load Dll1| | | + | |
- | |HelloWorldDLL1.dll|Load Dll2|輸出分別為DLL1-local、DLL1-work、DLL1-system| | + | |
- | |HelloWorldDLL2.dll| |輸出分別為DLL2-local、DLL2-work、DLL2-system| | + | |
- | 其中工作目錄為C:,執行檔放置路徑為C:/Debug 。\\ | + | |
- | 輸出為DLL$-local的與執行檔放在一起;DLL$-work放置於工作目錄;DLL$-system放置於system32中。 | + | |
- | ==== 測試案例 ==== | + | |
- | 以下為我們測試的5種case:\\ | + | |
- | ^案例^動作^結果^ | + | |
- | |Case1|於工作目錄執行Debug/HelloWorld.exe|DLL1-local| | + | |
- | |:::|:::|DLL2-local| | + | |
- | |Case2|刪除DLL2(local)|DLL1-local| | + | |
- | |:::|:::|DLL2-system| | + | |
- | |Case3|刪除DLL2(system)|DLL1-local| | + | |
- | |:::|:::|DLL2-work| | + | |
- | |Case4|還原所有DLL,刪除DLL1(local)|DLL1-system| | + | |
- | |:::|:::|DLL2-local| | + | |
- | |Case5|刪除DLL1(system)|DLL1-work| | + | |
- | |:::|:::|DLL2-local| | + | |
- | ===== 結論 ===== | + | |
- | 由以上五個case可以發現:dll的搜尋路徑是由執行檔路徑開始,接著是system32,最後是工作目錄。對Java而言,啟動jvm都是透過java指令,也就是java_home/bin/java.exe執行檔。因此放在java_home/bin中的dll,會比system32中的優先找到。後來我透過batch檔去執行Debug/HelloWorld.exe,結果發現搜尋的依據,是根據HelloWorld.exe而非batch檔。不管怎樣包裝,如果是A要去Load B,優先找尋的是A所在的目錄。 | + |