使用lua動態(tài)庫替換Script.NET中Lua解釋器的方法
使用lua動態(tài)庫替換Script.NET中Lua解釋器的方法是本文要介紹的內(nèi)容,Script.NET可以支持Lua腳本編輯調(diào)試,其中的Lua解釋器插件內(nèi)置的是Lua5.1.2版本的Lua動態(tài)庫,但如果直接用相應(yīng)的Lua動態(tài)庫替換其中的動態(tài)庫是無法運(yùn)行的,原因是Script.NET使用的Lua庫中增加了一個函數(shù)用于設(shè)置lua的庫路徑,Script.NET的Lua解釋器插件調(diào)用此函數(shù)把lua庫路徑設(shè)置到Script.NET的Lua解釋器目錄的bin目錄下。
某些情況下如果想替換其中的lua動態(tài)庫(例如自己修改了lua動態(tài)庫來實(shí)現(xiàn)特殊功能),可以參考下面的方法,也就是把Script.NET修改的代碼移植到自己定制的lua庫中重新編譯動態(tài)庫。
lualib.h中增加如下代碼:
- /* set lua library path *add by blueant* */
- LUALIB_API void (luaL_setlibpath) (lua_State *L, const char *path);
- lualib.c中修改的代碼(其中add by blueant部分是增加的):
- static char g_lualibpath[MAX_PATH+1];
- /* set lua library path *add by blueant* */
- LUALIB_API void luaL_setlibpath (lua_State *L, const char *path) {
- memset(g_lualibpath, 0, MAX_PATH+1);
- strcpy(g_lualibpath, path);
- }
- #undef setprogdir
- static void setprogdir (lua_State *L) {
- char buff[MAX_PATH + 1];
- char *lb;
- DWORD nsize = sizeof(buff)/sizeof(char);
- DWORD n;
- /////////////////add by blueant///////////////////////////
- HKEY hKey;
- LONG lRet;
- DWORD dwType = REG_SZ;
- DWORD dwSize = MAX_PATH;
- // 首先判斷是否設(shè)置了用于存儲庫路徑的靜態(tài)變量g_lualibpath,如果設(shè)置了就用這個變量
- if(strlen(g_lualibpath) > 0)
- {
- luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, g_lualibpath);
- lua_remove(L, -2); /* remove original string */
- return;
- }
- // 否則在注冊表中查找Script.NET的安裝路徑
- lRet = RegOpenKeyExA(HKEY_CURRENT_USER,
- "Software\\Blueant\\Script.NET\\2.0\\Settings", 0, KEY_READ|KEY_QUERY_VALUE, &hKey);
- if(lRet == ERROR_SUCCESS)
- {
- memset(buff, 0, MAX_PATH + 1);
- lRet = RegQueryValueExA(hKey, "Install", NULL, &dwType, (LPBYTE)buff, &dwSize);
- RegCloseKey(hKey);
- }
- if(lRet == ERROR_SUCCESS)
- {
- strcat(buff, "Interps\\Lua\\bin");
- luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff);
- lua_remove(L, -2); /* remove original string */
- return;
- }
- /////////////////////////////////////////////////////////
- n = GetModuleFileNameA(NULL, buff, nsize);
- if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL)
- luaL_error(L, "unable to get ModuleFileName");
- else {
- *lb = '\0';
- luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff);
- lua_remove(L, -2); /* remove original string */
- }
- }
- static void pusherror (lua_State *L) {
- int error = GetLastError();
- char buffer[128];
- if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
- NULL, error, 0, buffer, sizeof(buffer), NULL))
- lua_pushstring(L, buffer);
- else
- lua_pushfstring(L, "system error %d\n", error);
- }
- static void ll_unloadlib (void *lib) {
- FreeLibrary((HINSTANCE)lib);
- }
- static void *ll_load (lua_State *L, const char *path) {
- HINSTANCE lib = NULL;
- /////////////////add by blueant///////////////////////////
- // 記錄當(dāng)前路徑,并設(shè)置當(dāng)前路徑
- char szOldPath[MAX_PATH+1];
- char szdrive[MAX_PATH+1];
- char szdir[MAX_PATH+1];
- DWORD dwLen = 0;
- memset(szOldPath, 0, MAX_PATH + 1);
- dwLen = GetCurrentDirectory(255, szOldPath);
- memset(szdrive, 0, MAX_PATH + 1);
- memset(szdir, 0, MAX_PATH + 1);
- _splitpath(path, szdrive, szdir, NULL, NULL);
- strcat(szdrive, szdir);
- SetCurrentDirectory(szdrive);
- //////////////////////////////////////////////////////////
- lib = LoadLibraryA(path);
- ////////////////add by blueant////////////////////////////
- SetCurrentDirectory(szOldPath);
- //////////////////////////////////////////////////////////
- if (lib == NULL) pusherror(L);
- return lib;
- }
小結(jié):使用Lua動態(tài)庫替換Script.NET中Lua解釋器的方法的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!