[ZeroBrane Studio] Re: Call arbitrary Windows DLL Function

  • From: "Steve Russell" <steve.russell@xxxxxxxxxxxxxxxxxxxxx>
  • To: <zerobrane@xxxxxxxxxxxxx>
  • Date: Thu, 2 Oct 2014 09:14:04 +0100

Thanks for the feedback Rob.  I’ll investigate Alien.

 

Steve

 

From: zerobrane-bounce@xxxxxxxxxxxxx [mailto:zerobrane-bounce@xxxxxxxxxxxxx] On 
Behalf Of Rob Probin
Sent: 02 October 2014 08:13
To: zerobrane@xxxxxxxxxxxxx
Subject: [ZeroBrane Studio] Re: Call arbitrary Windows DLL Function

 

Perhaps someone else could comment on your extension DLL code - haven't had 
enough time to review it.  


On 2 Oct 2014, at 08:10, Rob Probin <rob.probin@xxxxxxxxx> wrote:

Not sure about the Lua built into ZBS, but standard Lua doesn't support such 
things without extension. But that's not difficult. 

 

For instance LuaforWindows https://code.google.com/p/luaforwindows/ has various 
extension libraries, for instance Alien - which allows access to unknown DLLs. 
There are other ones like LuaInterface that allows access to the CLR. 

 

You can use Alien even if you are not using LuaForWindows - it's available as a 
LuaRock, for instance, the Lua package manager. 


On 1 Oct 2014, at 11:56, "Steve Russell" <steve.russell@xxxxxxxxxxxxxxxxxxxxx> 
wrote:

Hi,

 

Does anybody know if it is possible to call a function in any system DLL in 
Windows/Lua 5.2/ZBS?

 

I would like to call 3rd party and system functions. Ideally I’d call the DLL 
functions from Lua directly, but I’m also considering writing a proxy DLL for 
Lua to load and this would then load the 3rd party DLL and interact with the 
functions contained therein.

 

I started by creating a Win32 DLL in VS2010 but Lua command line and ZBS 0.80 
hang/crash during the ‘require(“LuaProxy”)’, here’s the C code:

 

// LuaProxy.cpp : Defines the exported functions for the DLL application.

//

#include "stdafx.h"

#include <iostream> 

// LuaProxy.cpp : Defines the exported functions for the DLL application.

//

#include <lua.hpp>

extern "C"

{

static int funval = 10;

static int function_1(lua_State* l)

{

    std::cout << "[DLL] Function 1 is very funny." << std::endl;

    std::cout << "[DLL] It's fun value is: " << funval << std::endl;

    lua_pushnumber(l, funval);

    return 1;

}

static int function_2(lua_State* l)

{

    std::cout << "[DLL] Function 2 is twice as funny!" << std::endl;

    std::cout << "[DLL] It's fun value is: " << 2*funval << std::endl;

    lua_pushnumber(l, 2*funval);

    return 1;

}

/*

 * Registering functions

 */

static const struct luaL_Reg cfunctions[] = {

    {"fun1", function_1},

    {"fun2", function_2},

    {NULL, NULL}

};

int __declspec(dllexport) luaopen_LuaProxy(lua_State* l)

{

 //   luaL_newlibtable(l, cfunctions);

//    luaL_setfuncs(l, cfunctions, 0);

         luaL_openlib(l, "lp", cfunctions, 0);

         std::cout << "fun1(), fun2()" << std::endl;

    return 1;

}

} // end extern "C"

 

Cheers,

Steve

 

Other related posts: