您的位置:首页 > 编程语言 > Lua

VScode下LUA调用CAPI问题

2020-03-05 09:16 1006 查看

最近在学习LUA,看到云风大大很多年前的一个lua调用windowsAPI的代码,于是想拿来运行一下,等运行了再仔细看代码,然而这一调就是几个小时。

开始的尝试

一开始想着直接复制粘贴就完事了,后来发现DLL竟然导出失败,提示未找到的XXX文件,原来是没有配置对项目,不仅仅要区分DEBIG/RELEASE,还要设置对应的平台(x86=32bit,x64=64bit)

导出dll后让LUA require(“windows”)发现lua报错(我用的是VSCode里面的插件LUA)

报错内容:“error loading module”

然后仔细查找了require的命名规则,以及lua的c连接器的package.cpath,以及函数的命名规则 luaopen_XXX,发现都没有问题,这个时候我觉得可能是vscode的插件的解释器的版本和我自己编译时使用的LIB静态库版本不同 ,所以我就用同一个LUA静态库来执行(用c来调用脚本然后脚本调用我写的dll)这样的话环境肯定是一致的
ps:(lua有2中调用dll的方法:1,require,设置cpath,2,用package.loadlib)

我的dll库文件:

static const luaL_Reg libs[]{
{ "OpenDll",open_dll },
{ "GetProAddress",get_procaddress },
{ NULL,NULL }

};

extern "C" __declspec(dllexport) int luaopen_windows(lua_State *L)
{
luaL_newlib(L, libs);//会将所有函数放入一个表,并将这个表压倒栈上
return 1;
}

我在c中调用LUA脚本然后在脚本里面执行require继续报错

我觉得dll都是找到了的,于是我想看看函数有没有被访问到于是改动代码

extern "C" __declspec(dllexport) int luaopen_windows(lua_State *L)
{
printf("call luaopen_windows\n");
return 0;
}

结果,没有报错成功执行

然后再将luaL_newlib(L, libs)加回去,发现函数报错


也就是说我这个函数用错了?!所以我得换种办法加载所有的库于是我尝试自己写一个类似的库运行成功!!值得一提的是luaL_newlib()我在其他的时候用的都没有问题只有在导出dll的时候有问题,等以后看源码的时候希望能找到答案吧!

最后放到VScode里面运行依然报错,才发现是版本问题,我编译的DLL是32位的而它默认的是64位!!所以说 !! 版本!! 很重要!!!

  • 点赞
  • 收藏
  • 分享
  • 文章举报
Sprinkble 发布了15 篇原创文章 · 获赞 0 · 访问量 473 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: