6

我正在尝试将此代码移植到 Perl6。虽然我可以调用GetStdHandleGetConsoleMode并且SetConsoleMode,当我尝试调用时,我的脚本会中断ReadConsoleInput

Cannot locate symbol 'ReadConsoleInput' in native library 'Kernel32.dll'
  in method setup at C:\rakudo\share\perl6\sources\947BDAB9F96E0E5FCCB383124F923A6BF6F8D76B (NativeCall) line 287
  in method CALL-ME at C:\rakudo\share\perl6\sources\947BDAB9F96E0E5FCCB383124F923A6BF6F8D76B (NativeCall) line 576
  in block <unit> at test.p6 line 149

现在,该功能肯定存在。虽然它有一个复杂的签名,但我不确定我的脚本是否正确。这可能是原因吗?NativeCall 会看签名吗?

这就是我在代码中定义子的方式(评论来自 MS 文档)

#BOOL WINAPI ReadConsoleInput( _In_ HANDLE hConsoleInput, _Out_ PINPUT_RECORD lpBuffer, _In_ DWORD nLength, _Out_ LPDWORD lpNumberOfEventsRead );
sub ReadConsoleInput(Pointer[void], INPUT_RECORD is rw, uint32, uint32 is rw) is native('Kernel32') returns Bool { * };

如果需要,我可以发布其余的代码,但由于我必须定义所有结构和东西,而且通常来自头文件,所以它是很多样板文件。

4

1 回答 1

8

真正的函数名称是ReadConsoleInputAReadConsoleInputW,具体取决于您需要 ANSI 还是 Unicode (UTF-16) 输入。ReadConsoleInputC 头文件具有基于预处理器符号自动转换为正确函数的宏。但是当你像这样在运行时加载函数时,你必须准确地指定你想要的函数。

于 2019-08-21T00:13:15.693 回答