﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-ivaneeo's blog-随笔分类-lua-撸语言</title><link>http://www.blogjava.net/ivanwan/category/50762.html</link><description>自由的力量，自由的生活。</description><language>zh-cn</language><lastBuildDate>Wed, 08 Feb 2012 21:12:16 GMT</lastBuildDate><pubDate>Wed, 08 Feb 2012 21:12:16 GMT</pubDate><ttl>60</ttl><item><title>luacom打开中文路径的Word文件 </title><link>http://www.blogjava.net/ivanwan/archive/2012/02/09/369635.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Wed, 08 Feb 2012 17:48:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2012/02/09/369635.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/369635.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2012/02/09/369635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/369635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/369635.html</trackback:ping><description><![CDATA[<div><h1>背景</h1> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  luacom是一个非常强大的模块，它使我们可以应用各种com组件，比如Word，但是，有一个问题，中文文件名它不识别。为什么呢？因为com内部是 unicode的，于是luacom要求所有输入都是utf-8的，而且luacom的输出也是utf-8的。这可肿么办啊？</p> <h1>iconv</h1> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GNU有个libiconv库，要是有这个我们就不怕了！ luaforge上搜索下，果然有lua-iconv，安装！</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; luarocks install lua-iconv&nbsp; 不好意思，出错啦！出错的原因有两个：</p> <ul><li>我们没有安装libiconv库</li><li>lua-iconv没有提供用cl编译的方法</li></ul> <h1>自己编译lua-iconv<br /> </h1> <ol><li>下载编译好的Windows版的 <a href="http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.9.1.bin.woe32.zip"> libiconv</a></li><li>下载 <a href="http://files.luaforge.net/releases/lua-iconv/lua-iconvSourcecode/lua-iconv-6/lua-iconv-6.tar.gz"> lua-iconv</a> 源代码</li><li>解压<a> libiconv-1.9.1.bin.woe32.zip</a> 文件，并将include目录添加为vs2008的<strong>包含文件</strong>目录，将lib目录添加为vs2008的<strong>库文件</strong>目录中（<a href="http://blog.csdn.net/windtailljj/article/details/7203103">参见上一篇文章</a>）</li><li>解压lua-iconv的源代码<br /> </li><li>vs2008新建一个空的Win32 DLL工程（<a href="http://blog.csdn.net/windtailljj/article/details/7203103">参见上一篇文章</a>），命名为luaiconv，将 luaiconv.c 文件添加到工程中</li><li>修改源代码：int luaopen_iconv(lua_State *L)&nbsp; -&gt; __declspec(dllexport) int luaopen_luaiconv(lua_State *L) <ul><li>注意：最后生成的dll文件名，必须和 luaopen_luaiconv 中的 luaiconv 一样（<a href="http://blog.csdn.net/windtailljj/article/details/7203103">参见上一篇文章</a>）<br /> </li></ul> </li><li>项目属性 -&gt; 链接器 -&gt; 输入 -&gt; 附加库文件 ： lua51.lib iconv.lib charset.lib</li><li>编译生成release版的 luaiconv.dll 文件</li><li>将luaiconv.dll文件，以及<a>libiconv-1.9.1.bin.woe32.zip</a>解压出来的 iconv.dll（知道我为什么要改luaopen_iconv函数名了吧）和charset.dll文件一起拷贝到 luaforwindows的clibs目录中</li></ol> <h1>测试</h1>  <div bg_plain"=""><div><div><strong>[plain]</strong> <a href="http://blog.csdn.net/windtailljj/article/details/7203129#" title="view plain">view plain</a><a href="http://blog.csdn.net/windtailljj/article/details/7203129#" title="copy">copy</a></div></div><ol start="1"><li><span>require&nbsp;"luacom"&nbsp;&nbsp;</span></li><li>require&nbsp;"luaiconv"&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>function&nbsp;createIconv(to,&nbsp;from)&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;cd&nbsp;=&nbsp;iconv.new(to,&nbsp;from)&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;function(txt)&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;cd:iconv(txt)&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;</li><li>end&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>L&nbsp;=&nbsp;createIconv("utf-8",&nbsp;"gbk")&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>--&nbsp;注意：运行本文件会修改&nbsp;C:\你好word.docx&nbsp;文件，请注意备份&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>wordApp&nbsp;=&nbsp;assert(luacom.CreateObject("Word.Application"))&nbsp;&nbsp;</li><li>wordApp.Visible&nbsp;=&nbsp;true&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>wordDocPath&nbsp;=&nbsp;L"C:\\你好word.docx"&nbsp;&nbsp;</li><li>if&nbsp;not&nbsp;pcall(function()&nbsp;wordDoc&nbsp;=&nbsp;wordApp.Documents:Open(wordDocPath)&nbsp;end)&nbsp;then&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;wordDoc&nbsp;=&nbsp;wordApp.Documents:Add()&nbsp;&nbsp;</li><li>end&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>wordApp.Selection:TypeText(L"你好word")&nbsp;&nbsp;</li><li>wordDoc:SaveAs2(wordDocPath,&nbsp;wdFormatDocument)&nbsp;&nbsp;</li></ol></div><br />  <p>以上测试代码，第一次运行时会创建 C:\你好word.docx 文件，以后再运行时会打开这个文件，每次运行都会输入 &#8220;你好word&#8221; 文字。如果你是Word 2003，那么，请将docx改为doc即可。</p> <h1>参考文献</h1> <p><a href="http://hi.baidu.com/nivrrex/blog/item/17c231adad9e8a0f4b36d6ca.html">http://hi.baidu.com/nivrrex/blog/item/17c231adad9e8a0f4b36d6ca.html</a></p> <blockquote> <p>这位大哥自己用VC的函数写了转换函数，不过没有封装成库，而且我觉得写得不够简洁，用iconv库比较好，还不容易出错</p> </blockquote> <p><a href="http://www.cppblog.com/darkdestiny/archive/2009/04/25/81055.html">http://www.cppblog.com/darkdestiny/archive/2009/04/25/81055.html</a></p> <blockquote> <p>这位大哥，自己用iconv实现了转换，也没有封装成库。我的&#8220;L&#8221;函数也是从他这借来的，非常感谢！不过，我认为它这个相比我这个有两个弱点：</p> <p>1、每次调用L函数，都要经过 iconv 打开、转换、关闭的过程，而我对一种形式的转换只需要打开一次（lua-iconv实现的^_^）</p> <p>2、如果要实现反向转换，即utf-8到gbk，那么还得修改模块，而我这里就不用了（当然也是lua-iconv实现的^_^）<br /> </p> </blockquote> <a href="http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.9.1.bin.woe32.zip">libiconv</a>的说明</div><img src ="http://www.blogjava.net/ivanwan/aggbug/369635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2012-02-09 01:48 <a href="http://www.blogjava.net/ivanwan/archive/2012/02/09/369635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将 LuaSocket 静态编译到 cocos2d-x 目标执行文件中</title><link>http://www.blogjava.net/ivanwan/archive/2012/02/08/369555.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 07 Feb 2012 16:03:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2012/02/08/369555.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/369555.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2012/02/08/369555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/369555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/369555.html</trackback:ping><description><![CDATA[<div><p>Cocos2d-x 已经提供了对 Lua 的基本支持，但除了 Lua 的基本库外，并没有捆绑一些常用库，例如 LuaSocket。</p> <p>经过一番尝试，终于搞定了此问题 :)</p> <p>获得 LuaSocket 源代码后，在 cocos2d-x 项目的 libs/lua 目录中建立子目录 exts/luasocket，并将  luasocket-2.0.2/src 目录中所有的 *.c/*.h 文件拷贝到 libs/lua/exts/luasocket 目录中。</p> <p>在 libs/lua/exts 目录中建立文件：</p> <p><strong>lualoadexts.h</strong></p> <pre>#ifndef __LUALOADEXTS_H_ #define __LUALOADEXTS_H_  #include "lauxlib.h"  void luax_initpreload(lua_State *L);  #endif // __LUALOADEXTS_H_ </pre> <p><strong>lualoadexts.c</strong></p> <pre>#include "lualoadexts.h"  // luasocket #include "luasocket.h" #include "mime.h"  static luaL_Reg luax_preload_list[] = {     {"socket.core", luaopen_socket_core},     {"mime.core", luaopen_mime_core},     {NULL, NULL} };  void luax_initpreload(lua_State *L) {     luaL_Reg* lib = luax_preload_list;     luaL_findtable(L, LUA_GLOBALSINDEX, "package.preload",                    sizeof(luax_preload_list)/sizeof(luax_preload_list[0])-1);     for (; lib-&gt;func; lib++) {         lua_pushstring(L, lib-&gt;name);         lua_pushcfunction(L, lib-&gt;func);         lua_rawset(L, -3);     }     lua_pop(L, 1); } </pre> <p>最后，打开 <strong>libs/lua/cocos2dx_support/LuaEngineImpl.cpp </strong>文件，在 CCLuaScriptModule::CCLuaScriptModule() 构造函数最后载入 Lua 标准库和扩展库的代码：</p> <pre>CCLuaScriptModule::CCLuaScriptModule() {     d_ownsState = true;     d_state = lua_open();     luaL_openlibs(d_state);     int nOpen = tolua_Cocos2d_open(d_state);     CC_UNUSED_PARAM(nOpen);     nOpen = tolua_SimpleAudioEngine_open(d_state);     CC_UNUSED_PARAM(nOpen);      // init standard libraries     luaL_openlibs(d_state);     // init more libraries     luax_initpreload(d_state); } </pre> <p>LuaScoket 除了 C 代码，还有一部分是 Lua 代码，所以需要<strong>将 luasocket-2.0.2/src/*.lua 复制到项目中</strong>，然后用下列 Lua 代码进行测试：</p> <pre>local socket = require("socket") print("socket module:", socket) print("socket.connect function:", socket.connect) print("socket.bind function:", socket.bind)  print("\n") print("io module:", io) </pre></div><img src ="http://www.blogjava.net/ivanwan/aggbug/369555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2012-02-08 00:03 <a href="http://www.blogjava.net/ivanwan/archive/2012/02/08/369555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将 Lua 模块编译为 C 代码</title><link>http://www.blogjava.net/ivanwan/archive/2012/02/08/369553.html</link><dc:creator>ivaneeo</dc:creator><author>ivaneeo</author><pubDate>Tue, 07 Feb 2012 16:01:00 GMT</pubDate><guid>http://www.blogjava.net/ivanwan/archive/2012/02/08/369553.html</guid><wfw:comment>http://www.blogjava.net/ivanwan/comments/369553.html</wfw:comment><comments>http://www.blogjava.net/ivanwan/archive/2012/02/08/369553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ivanwan/comments/commentRss/369553.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ivanwan/services/trackbacks/369553.html</trackback:ping><description><![CDATA[<div><p>将 Lua 源代码直接放入最终产品，显然不是个理想选择。利用 LOOP 提供的 Precompiler 工具，可以将 Lua 模块编译为 C 代码。</p> <h3>准备工作</h3> <p><a href="http://loop.luaforge.net/" target="_blank">LOOP</a> 是一个 Lua 的 OOP 框架，Precompiler 则是 LOOP 中包含的一个工具。要安装 LOOP，得先安装 <a href="http://www.luarocks.org/" target="_blank">LuaRocks</a>。</p> <pre>$ wget http://luarocks.org/releases/luarocks-2.0.5.tar.gz $ tar zxf luarocks-2.0.5.tar.gz $ cd luarocks-2.0.5 $ ./configure $ make $ sudo make install </pre> <p>然后安装 LOOP:</p> <pre>$ sudo luarocks install loop </pre> <p>OK，现在准备工作完成了，接下来就是编译 Lua 模块为 C 代码。</p> <h3>编译</h3> <p>我们的框架中有一个 display.lua 模块，下面的代码可以将这个模块编译出来：</p> <pre>$ precompiler.lua -o luaqeeplayscripts -l "?.lua" -b -p qeeplay qeeplay/display.lua </pre> <p>最后会得到 luaqeeplayscripts.c/.h 文件。其中定义了函数：</p> <pre>qeeplay int luaopen_qeeplay_display(lua_State *L); </pre> <p>在上述命令行中，各个参数的意义如下：</p> <pre>-o: 指定输出文件名，例如 -o luaqeeplayscripts 会输出 luaqeeplayscripts.c/.h  -l: 指定推断 lua 模块名的模式，设定为 -l "?.lua" 就会以 lua 源文件名称作为模块名。     例如 display.lua 就是 display 模块。如果 display.lua 文件在 qeeplay 子目录中，     那么 qeeplay/display.lua 的模块名就是 qeeplay.display。  -b: 编译为字节码  -p: 函数定义的前缀，一般指定一个可以方便以后对生成的 .c/.h 文件进行再处理 </pre> <p>如果要将多个 lua 文件编译为一个 C 代码，可以添加更多的文件名到命令行中，例如：</p> <pre>$ precompiler.lua -o luasocketscripts -l "?.lua" -b -p socket \     socket.lua \     socket/url.lua \     socket/tp.lua \     socket/smtp.lua \     socket/mime.lua \     socket/ltn12.lua \     socket/http.lua \     socket/ftp.lua </pre> <p>会创建 luasocketscripts.c/.h 文件，其中定义下列函数：</p> <pre>socket int luaopen_socket(lua_State *L); socket int luaopen_socket_url(lua_State *L); socket int luaopen_socket_tp(lua_State *L); socket int luaopen_socket_smtp(lua_State *L); socket int luaopen_socket_mime(lua_State *L); socket int luaopen_socket_ltn12(lua_State *L); socket int luaopen_socket_http(lua_State *L); socket int luaopen_socket_ftp(lua_State *L); </pre> <h3>载入编译好的 C 代码</h3> <p>利用前一篇文章中的 lualoadexts.c/lualoadexts.h，做一些修改即可：</p> <p><strong>luaqeeplayscripts.c</strong></p> <pre>#include "lualoadexts.h"  // qeeplay #include "luaqeeplayscripts.h"  static luaL_Reg luax_preload_list[] = {     {"qeeplay.display", luaopen_qeeplay_display},     {NULL, NULL} };  void luax_initpreload(lua_State *L) {     .... } </pre> <p>如果有更多模块需要载入，只需要 include 相应的头文件，并修改 luax_preload_list 定义即可。</p></div><img src ="http://www.blogjava.net/ivanwan/aggbug/369553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ivanwan/" target="_blank">ivaneeo</a> 2012-02-08 00:01 <a href="http://www.blogjava.net/ivanwan/archive/2012/02/08/369553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>