2008-11-07 3 views
10

alien을 사용하여 Win32 함수를 호출하려고합니다. 이 코드를 시도했지만 충돌이 발생하고 이유를 이해할 수 없습니다.루아에 외계인과 문자열을 반환하는 Win32 함수 호출

require("alien") 

local f = alien.Kernel32.ExpandEnvironmentStringsA 
f:types("int", "string", "pointer", "int") 
local buffer = alien.buffer(512) 
f("%USERPROFILE%", 0, 512) 

답변

11

그것은이다 그대로 나를 위해, 기회가 밖으로 외국인 테스트 할 수있는 좋은 질문 ... 당신이 괜찮다면

, 나는 외국인 사용하는 방법에 대해 설명 할 수있는 기회를, 그래서이 스레드에 걸림돌이 걸리는 나 같은 사람들은 (require에 익숙하지 않다.)

당신은 LuaForge 페이지에 대한 링크를 제공하고 거기에 가서 내가 그것을 얻기 위해 루아 록이 필요하다는 것을 알았다. :-( 나는 언젠가 후자를 설치해야한다. 그러나 나는 지금 그걸 건너 뛰기로 선택했다. 그래서 나는 저장소에 가서 alien-0.4.1-1.win32-x86.rock을 다운로드했다. 평소와 같이 압축을 풀 수있는 일반 Zip 파일이라는 것을 알게되었다.

require으로 조금 멍청이 후, 나는 빠른 테스트를 위해 루아 스크립트의 경로를 해킹했다. 내가 대신 내 환경에서 LUA_PATHLUA_CPATH를 만들어야합니다, 나는 나중에 할 것입니다.

그래서 나는 외계인했다. lua, core.dll 및 struct.dll을 압축 해제 한 폴더에서 가져 와서 공용 라이브러리 저장소에 Alien이라는 디렉토리에 넣습니다.
그리고 f 내 스크립트의 시작 라인을 따르게 (나쁜 해킹 경고!) : 메시지 박스 :
package.path = 'C:/PrgCmdLine/Tecgraf/lib/?.lua;' .. package.path 
package.cpath = 'C:/PrgCmdLine/Tecgraf/lib/?.dll;' .. package.path 
require[[Alien/alien]] 

가 그럼 난 즉각적인 시각적 결과 단순, 노 하지요이 기능을 시도했다.

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

예, 메시지 상자가 있습니다. 하지만 확인을 클릭하면 Lua가 고장났습니다. 아마도 당신을 좋아할 것입니다. 외국인 문서를 빠르게 스캔 한 후, 나는 (익명의) 범인을 발견 :

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

그래서 작동하기 위해 전화를 걸 사소한했다 : 우리는 윈도우 API에 대한 stdcall을 호출 규칙을 사용합니다 : 나는 EEV 호출에서 버퍼 매개 변수를 넣어

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)) 

주 ...

+0

좋아! Windows 용 Lua (http://luaforwindows.luaforge.net/)도 사용할 수 있습니다. 그것은 상자에서 일하는 외계인과 함께 제공됩니다. – Jazz

+0

예,하지만 좋은 패키지이지만, "모든 배터리 포함"철학을 좋아하지 않아 파이썬보다 더 큰 다운로드가 발생합니다 ... – PhiLho

관련 문제