2008-11-07 10 views

Antwort

11

Es ist eine gute Frage, wie es ist, für mich, eine Gelegenheit Alien zu testen ...

Wenn Sie nichts dagegen haben, nehme ich die Gelegenheit, zu erklären, wie Alien zu verwenden, Leute wie ich (nicht sehr gewöhnt an require) Stolpern auf diesen Thread wird beginnen ...

Sie geben den Link zur LuaForge Seite, ich ging dorthin, und sah, dass ich LuaRock brauchte, um es zu bekommen. :-( sollte ich das letztere eines Tages installieren, aber ich entschied, dass für jetzt überspringen. Also ging ich in das Repository heruntergeladen und die alien-0.4.1-1.win32-x86.rock. Ich fand heraus, dass es eine einfache Zip-Datei war, die ich wie üblich entpacken kann.

nach einem wenig mit require Fummelei, landete ich die Pfade in dem Lua-Skript für einen schnellen Test Hacking. ich LUA_PATH und LUA_CPATH in meiner Umgebung statt schaffen soll, wie ich später das tun werde.

So fremd ich nahm. lua, core.dll und struct.dll aus den entpackten Ordnern und legen sie unter einem Verzeichnis mit dem Namen Alien in einem gemeinsamen Bibliotheks-Repository
Und ich habe die f ach Linien zu Beginn meiner Skript (schlecht Hack Warnung!):

package.path = 'C:/PrgCmdLine/Tecgraf/lib/?.lua;' .. package.path 
package.cpath = 'C:/PrgCmdLine/Tecgraf/lib/?.dll;' .. package.path 
require[[Alien/alien]] 

Dann versuchte ich es mit einer einfachen, No-Frills-Funktion mit sofortigem visuellem Ergebnis: MessageBox.

local mb = alien.User32.MessageBoxA 
mb:types{ 'long', 'long', 'string', 'string', 'long' } 
print(mb(0, "Hello World!", "Cliché", 64)) 

Ja, ich habe die Message Box! Aber als ich auf "OK" geklickt habe, bin ich wahrscheinlich genauso wie du auf Lua gestoßen. Nach einem schnellen Scan der Alien docs, fand ich die (unbenannt) Täter aus:

mb:types{ ret = 'long', abi = 'stdcall', 'long', 'string', 'string', 'long' } 

So war es trivial zu Ihrem Anruf zu arbeiten: Wir haben die stdcall Aufrufkonvention für den Windows-API verwenden müssen:

local eev = alien.Kernel32.ExpandEnvironmentStringsA 
eev:types{ ret = "long", abi = 'stdcall', "string", "pointer", "long" } 
local buffer = alien.buffer(512) 
eev("%USERPROFILE%", buffer, 512) 
print(tostring(buffer)) 

Hinweis ich den Pufferparameter in der EEV-Aufruf ...

+0

Große setzen! Sie können auch Lua für Windows (http://luaforwindows.luaforge.net/) verwenden. Es kommt mit Alien aus der Box arbeiten. – Jazz

+0

Ja, aber obwohl es ein schönes Paket ist, mag ich nicht seine Philosophie "alle Batterien enthalten", was zu einem größeren Download als Pythons ... – PhiLho