zoukankan      html  css  js  c++  java
  • lua加载DLL

    .cpp

    //若没有在项目属性--库文件、依赖文件、包含添加。则添加一下路径

    #pragma  comment (lib,"lua5.1.lib")

    #include "stdafx.h"

    #include "lua.hpp"

    extern "C" {

    #include "lua.h" 

    #include "lualib.h" 

    #include "lauxlib.h" 

    }

    static int MyLuaDLL_HelloWorld(lua_State* L)

    {

          MessageBoxA(NULL,"Hello","World",MB_OK);

          return 0;

    }

    static int MyLuaDLL_average(lua_State *L)

    {

          int n = lua_gettop(L);

          double sum = 0;

          int i;

          for (i = 1; i <= n; i++)

          {

               sum += lua_tonumber(L, i);

          }

          lua_pushnumber(L, sum / n);

          lua_pushnumber(L, sum);

          //2代表返回2个参数

          return 2;

    }

    //当lua使用MyLuaDLL.HelloWorld时,响应函数MyLuaDLL_HelloWorld

    static const luaL_reg MyLuaDLLFunctions [] =

    {

          {"HelloWorld",MyLuaDLL_HelloWorld},

          {"average",MyLuaDLL_average},

          {NULL,NULL}

    };

    /*此处导出函数luaopen_MyLuaDLL。其中MyLuaDLL要与.exe程序名一致

      若lua用dofile调用dll必须一致,若lua用loadlib加载dll可不一致

      luaL_register(L, "MyLuaDLL", MyLuaDLLFunctions); 中的MyLuaDLL,用于给lua调用DLL中的函数,类似外放对象。

    */

    extern "C"  __declspec(dllexport) int luaopen_MyLuaDLL(lua_State* L)

    {

          luaL_register(L, "MyLuaDLL", MyLuaDLLFunctions);

          return 1;

    }

    BOOL APIENTRY DllMain( HMODULE hModule,

                           DWORD  ul_reason_for_call,

                           LPVOID lpReserved

                                 )

    {

          switch (ul_reason_for_call)

          {

          case DLL_PROCESS_ATTACH:

               //printf("Process attach. ");

               break;

          case DLL_PROCESS_DETACH:

               //printf("Process detach. ");

               break;

          case DLL_THREAD_ATTACH:

               //printf("Thread attach. ");

               break;

          case DLL_THREAD_DETACH:

               //printf("Thread detach. ");

               break;

          }

          return (TRUE);

    }

    .lua

    --Lua_Dll.dll必须放在luajit同一目录下

    local testlib = package.loadlib("Lua_Dll.dll","luaopen_MyLuaDLL");   --获取DLL中抛出函数地址

    print (testlib)

    if(testlib)then

        testlib();  --调用DLL中抛出函数

    else

        -- Error

    end

    MyLuaDLL.HelloWorld();

    a,b=MyLuaDLL.average(23,33,3344);

    print("average:",a,"sum:",b);

  • 相关阅读:
    【转载】C#使用Split函数根据特定分隔符分割字符串
    【转载】 Asp.Net安全之防止脚本入
    【转载】C#使用as关键字将对象转换为指定类型
    【转载】C#使用is关键字检查对象是否与给定类型兼容
    【转载】C#将字符串中字母全部转换为大写或者小写
    【转载】使用Response.WriteFile输出文件以及图片
    【转载】常见面试题:C#中String和string的区别分析
    【转载】Asp.Net中Cookie对象的作用以及常见属性
    【转载】C#指定文件夹下面的所有内容复制到目标文件夹下面
    【转载】Asp.Net中应用程序的事件响应次序
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/10962878.html
Copyright © 2011-2022 走看看