替换Script.NET中Lua解释器使用的lua动态库的方法

Script.NET可以支持Lua脚本编辑调试,其中的Lua解释器插件内置的是Lua5.1.2版本的Lua动态库,但如果直接用相应的Lua动态库替换其中的动态库是无法运行的,原因是Script.NET使用的Lua库中增加了一个函数用于设置lua的库路径,Script.NET的Lua解释器插件调用此函数把lua库路径设置到Script.NET的Lua解释器目录的bin目录下。某些情况下如果想替换其中的lua动态库(例如自己修改了lua动态库来实现特殊功能),可以参考下面的方法,也就是把Script.NET修改的代码移植到自己定制的lua库中重新编译动态库。

 

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;
  // 首先判断是否设置了用于存储库路径的静态变量g_lualibpath,如果设置了就用这个变量
  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///
  // 记录当前路径,并设置当前路径
  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;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lua开发包是Script.NET脚本语言开发平台的Lua插件,必须先安装Script.NET平台V2.1.1版本,然后再安装此开发包。 Script.NET平台下载地址:http://download.csdn.net/source/1034307 http://www.blueantstudio.net/scriptnet/download/download.htm Script.NET是蓝蚂蚁工作室开发的一套用于Tcl/Python/Ruby/Lua/NSIS 等脚本语言开发的集成开发环境,刚刚发布的2.1.1版本新增了Ruby脚本的支持,可以支持Ruby脚本的开发、调试、生成可执行文件、控制台等功能,可以支持wxRuby、RubyTk等界面库,目前还不支持Rails的调试,后续版本会不断完善。 下载地址和详细介绍请请参考蓝蚂蚁工作室的主页: http://www.blueantstudio.net Script.NET主要功能特性如下: 1、编辑、调试、运行tcl、python、lua、ruby脚本; 2、脚本的编译/加密和生成可执行文件(每种脚本语言支持的程度不同); 3、效率分析等辅助功能(目前只有tcl脚本支持了此功能); 4、关键字帮助,通过F1键或鼠标移动到关键字上,获取详细的帮助信息; 5、收集了较多的脚本扩展包、帮助文档和演示程序,目前tcl的扩展包收集较多,其他脚本也正在收集完善,除了常用的tk、wx、pmw,还有图象、多媒体、界面库等很多各种各样的扩展包,以后我们打算通过在线更新的方式使用户可以更方便的获取到各种扩展包; 6、附带了ftp、代码统计、正则表达式等一些扩展工具; 7、采用灵活的可扩展架构,整个系统可以灵活的扩展各种解释器、界面组件、工具、工程、界面风格等; 8、支持控制台功能(目前支持tcl/python/lua/ruby控制台、telnet控制台、串口控制台可用,其他脚本控制台正在开发); 9、Script.NET作为一个通用平台对外提供了很多接口,可以通过脚本等方式调用平台的各种功能,其的tcl语言支持很多平台扩展命令,可以通过tcl操纵平台的各种功能,对平台进行扩展; 10、封装的TclFace页面扩展包,可以通过面向对象的tcl脚本生成各种平台的页面功能,此扩展包除了可以用于本地应用程序生成页面之外,还可以运行于AOLServer WEB服务器,作为一种类似于JSF的服务器端脚本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值