關於Lua腳本中跨路徑引用以及多重跨路徑引用的問題

問題1:載入其他目錄的lua腳本,並且其中引用了和lua腳本放在同目錄中的dll文件
比如Lua腳本中有這樣一句
require("test")用來載入同目錄下名爲test.dll的庫,直接運行這個Lua腳本是沒問題的
但是在其他目錄下的exe文件將此Lua腳本嵌入運行就會找不到test.dll了
因爲當前運行的exe和dll沒在同一個目錄
而require("c:\\dir\\test")這樣是行不通的,require的參數只能是包名,而不能有路徑
得通過設置路徑package.cpath來實現,注意這裏是package.cpath而不是package.path
package.cpath是用來設置後綴爲dll的路徑
package.path是用來設置後綴爲lua的路徑
請根據自己的情況來決定
package.cpath的格式是用分號隔開各路徑,並用問號做通配,例如:.\?.dll;.\?51.dll;
把我們自己的路徑加進去
package.cpath = package.cpath..";"..myWorkPath.."\\?.dll"
然後在使用require語句就能正常引用了

問題2:接上面問題的情況,解決後發現另一個問題,剛剛引用的dll中調用了另外一個dll,引用失敗
很明顯問題還是類似,要加載的dll和exe沒有在同一目錄
這裏需要把dll目錄添加到加載路徑中
找到一篇文章詳細介紹這種情況:http://blog.csdn.net/zhufangyou/article/details/6423751
裏面有一個MSDN的鏈接的詳細說明,提到了SetDllDirectory這個函數,可惜只支持Win8
而裏面提供的幾個方法:
SetDllDirectory,據說不同版本的Windows有兼容問題
SetCurrentDirectory,腳本運行時間很長,擔心對其他模塊有影響
最後一個是把載入dll的方式改爲LoadLibraryEx("DLL絕對路徑", NULL, LOAD_WITH_ALTERED_SEARCH_PATH); 
通過指定LOAD_WITH_ALTERED_SEARCH_PATH,讓系統DLL搜索順序從DLL所在目錄開始。
但是難道去改Lua內部邏輯?是的,正好找到雲風的一篇博客提到修改Lua載入dll的路徑問題的
裏面有提到修改位置,再根據這片博客的編譯方法:
終於把載入的問題全搞定了
發佈了37 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章