Вызов функций Win32, возвращая строки с посторонним объектом в Lua

В jUnit есть удобное правило для таких сценариев, как ваш.

public class MyHandlerTest {

    @Rule
    // creates a temp folder that will be removed after each test
    public org.junit.rules.TemporaryFolder folder = new org.junit.rules.TemporaryFolder();

    private MyHandler handler;

    @Before
    public void setUp() throws Exception {
        File file = folder.newFile("myFile.txt");
        // do whatever you need with it - fill with test content and so on.
        handler = new MyHandler(file.getAbsolutePath()); // use the real thing
    }

    // Test whatever behaviour you need with a real file and predefined dataset.
}
10
задан Jazz 7 November 2008 в 15:26
поделиться

1 ответ

Это - хороший вопрос, как это, для меня, возможность проверить Посторонний объект...

Если Вы не возражаете, я пользуюсь возможностью, чтобы объяснить, как использовать Посторонний объект, таким образом, люди как я (не очень привыкший к require) спотыкание на этот поток начнет...

Вы даете ссылку на страницу LuaForge, я пошел туда и видел, что мне был нужен LuaRock для получения ее.:-( Я должен установить последнего когда-нибудь, но я принял решение пропустить это на данный момент. Таким образом, я перешел к репозиторию и загрузил alien-0.4.1-1.win32-x86.rock. Я узнал, что это был простой zip-файл, который я мог разархивировать, как обычно.

После нащупывания немного с require, Я закончил взламывание путей в сценарии Lua для быстрого теста. Я должен создать LUA_PATH и LUA_CPATH в моей среде вместо этого, я сделаю это позже.

Таким образом, я взял alien.lua, core.dll и struct.dll от разархивированных папок и подверг их каталогу под названием Посторонний объект в общем репозитории библиотеки.
И я добавил следующие строки к запуску моего сценария (плохой взлом, предупреждающий!):

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

Да, я получил окно сообщения! Но после нажатия "ОК", я получил катастрофический отказ Lua, вероятно, как Вы. После быстрого сканирования Посторонних документов я узнал преступника (без имени): мы должны использовать stdcall соглашение о вызовах для Windows API:

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

11
ответ дан 4 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: