DFusion中lua调用c++生成的dll库,并且lua调用c++代码(遍历文件夹中整个目录)

来源:互联网 发布:9wifi九维网络登入网站 编辑:程序博客网 时间:2024/05/20 19:16


首先:工具:生成dll用vs2008。

一、首先生成lua库,即(*.lib)库

1、在lua官网上下载lua源代码

2、用vs2008建一个静态库,把lua源代码全加入到工程中,可以把lua.c、luac.c不用放到工程中。编译生成就可以了。

二、生成dll库

1.用vs2008建一个动态库,配置环境:

 添加编译所需要(依赖)的 lib 文件
[解决方案资源管理器]“项目->属性->配置属性->连接器->输入->附加依赖项”里填写“lua5.1.lib”,多个 lib 以空格隔开。 (等同于“#pragma comment(lib, "lua5.1.lib") ”语句)
 添加库(Libs)文件目录
方法 1:[解决方案资源管理器]“项目->属性->配置属性->连接器->常规->附加库目录” 方法 2:[菜单]“工具->选项->项目和解决方案->C++ 目录”,选择对应平台,然后添加所需“库文件”目录
添加包含(include)文件目录(包含所有的lua的*.h文件)
方法 1:[解决方案资源管理器]“项目->属性->配置属性->C/C++->常规->附加包含目录” 方法 2:[菜单]“工具->选项->项目和解决方案->C++ 目录”,选择对应平台,然后添加所需“包括文件”目录
直接看源代码:
// folderScan.cpp : 定义 DLL 应用程序的导出函数。//#include "stdafx.h"//#include <dir.h>#include <string.h>#include <errno.h>#include <stdlib.h>#define LUA_COMPAT_MODULEextern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};#include "log.h"#include <windows.h>//#pragma comment(lib,"C:\\Users\\liuweifeng\\Documents\\Visual Studio 2008\\Projects\\folderScan\\lib\\lua5.2.1.lib")#if defined(_WIN32)extern "C" _declspec(dllexport) int luaopen_MyLuaDLL(lua_State* L);#elseextern "C" int luaopen_MyLuaDLL(lua_State* L);#endifCLog log;int MyLuaDLL_Dir(lua_State *L){WIN32_FIND_DATA FindFileData;HANDLE hFind = INVALID_HANDLE_VALUE;char DirSpec[MAX_PATH + 1] = {0};//指定路径DWORD dwError;const char *path = luaL_checkstring(L,1);const char *desDir = luaL_checkstring(L,2);log.Add(path);log.Add(desDir);strcpy(DirSpec,path);strncat (DirSpec, "\\*", 3);log.Add(DirSpec);hFind = FindFirstFile(DirSpec,&FindFileData);char err[64] = {0};if (hFind == INVALID_HANDLE_VALUE){lua_pushnil(L);itoa(GetLastError(),err,10);lua_pushstring(L, err); /* error message */return 2;}/* create result table */lua_newtable(L);int i = 1;char sourcePath[MAX_PATH + 1] = {0};char destPath[MAX_PATH + 1] = {0};if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY ){lua_pushnumber(L, i++); /* push key */lua_pushstring(L, FindFileData.cFileName); /* push value */lua_settable(L, -3);sprintf(sourcePath,"%s\\%s",path,FindFileData.cFileName);sprintf(destPath,"%s\\%s",desDir,FindFileData.cFileName);log.Add(destPath);MoveFile(sourcePath,destPath);}while(FindNextFile(hFind, &FindFileData) != 0){if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY){lua_pushnumber(L, i++); /* push key */lua_pushstring(L, FindFileData.cFileName); /* push value */lua_settable(L, -3);sprintf(sourcePath,"%s\\%s",path,FindFileData.cFileName);sprintf(destPath,"%s\\%s",desDir,FindFileData.cFileName);log.Add(destPath);MoveFile(sourcePath,destPath);}}FindClose(hFind);return 1;}/*-----------注册函数---------------*/ static const struct luaL_Reg MyLuaDLLFunctions [] ={{"myDir",MyLuaDLL_Dir},{NULL, NULL}};extern "C" _declspec(dllexport) int luaopen_MyLuaDLL(lua_State* L)//dll接口{luaL_register (L, "MyLuaDLL", MyLuaDLLFunctions);//luaL_setfuncs (L, MyLuaDLLFunctions,0);//luaL_newlib(L, MyLuaDLLFunctions);//luaL_openlibs(L); return 1;}
三、lua调用dll源代码:

 --调用外部dll local testlib = package.loadlib("E:/dfproject/imageScan/script/folderScan.dll","luaopen_MyLuaDLL")if testlib thentestlib()--必须有这个LOG("testlib")elseLOG("ERROR")end
 ImageList = MyLuaDLL.myDir(dirPath,desDirPath)if ImageList thenfor k,v in pairs(ImageList) do LOG("k = "..k.." v = "..v)endelseLOG("DIR ERROR")end
我的myDir函数返回的是一个table。
注意:我用的lua版本lua5.1,所有这个版本中还有luaL_register这个函数,最新的版本中没有这个函数了。


原创粉丝点击