Win32 기능 호출 Lua의 외계인과 함께 문자열을 반환합니다

StackOverflow https://stackoverflow.com/questions/272425

  •  07-07-2019
  •  | 
  •  

문제

사용하려고합니다 외계인 Win32 기능을 호출하려면 이 코드를 시도했지만 충돌하고 이유를 이해하지 못합니다.

require( "alien" )

local f = alien.Kernel32.ExpandEnvironmentStringsA
f:types( "int", "string", "pointer", "int" )
local buffer = alien.buffer( 512 )
f( "%USERPROFILE%", 0, 512 )
도움이 되었습니까?

해결책

나에게 외계인을 테스트 할 수있는 좋은 질문입니다 ...

당신이 마음에 들지 않으면, 나는 외계인을 사용하는 방법을 설명 할 기회를 가졌으므로 나와 같은 사람들은 require)이 스레드에 걸려 넘어지면 시작됩니다 ...

당신은 Luaforge 페이지에 대한 링크를주고, 나는 거기에 갔다. 그리고 그것을 얻기 위해 Luarock이 필요하다는 것을 보았다. :-( 나는 언젠가 후자를 설치해야하지만 지금은 그것을 건너 뛰기로 결정했다. 그래서 나는 저장소에 가서 다운로드했다. Alien-0.4.1-1.WIN32-X86.ROCK. 평소와 같이 압축을 풀 수있는 일반 지퍼 파일이라는 것을 알았습니다.

조금 뒤틀린 후 require, 나는 빠른 테스트를 위해 LUA 스크립트의 경로를 해킹했습니다. 나는 만들어야한다 LUA_PATH 그리고 LUA_CPATH 대신 내 환경에서 나중에 그렇게하겠습니다.

그래서 나는 압축 된 폴더에서 Alien.lua, core.dll 및 struct.dll을 가져다가 공통 라이브러리 저장소에서 Alien이라는 디렉토리 아래에 넣었습니다.
그리고 스크립트의 시작에 다음 줄을 추가했습니다 (잘못된 해킹 경고!) :

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

그런 다음 즉각적인 시각적 결과 인 MessageBox와 함께 간단하고 프릴 기능으로 시도했습니다.

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

예, 메시지 상자를 받았습니다! 그러나 OK를 클릭하면 Lua가 충돌했을 것입니다. 외계인 문서를 빠르게 스캔 한 후, 나는 (이름이없는) 범인을 알았습니다.

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

그래서 일을 요청하는 것은 사소한 일이었습니다.

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

참고 버퍼 매개 변수를 EEV 호출에 넣었습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top