繁体   English   中英

NativeCall在Kernel32.dll中找不到函数

[英]NativeCall can't find a function in Kernel32.dll

我正在尝试将此代码移植到Perl6。 虽然我可以调用GetStdHandleGetConsoleModeSetConsoleMode ,但是当我尝试调用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 { * };

如果需要,我可以发布其余的代码,但这是很多样板,因为我必须定义所有结构和内容,这些结构和内容通常来自头文件。

实际的函数名称为ReadConsoleInputAReadConsoleInputW ,具体取决于您要输入ANSI还是Unicode(UTF-16)。 C头具有宏,这些宏会根据预处理器符号自动将ReadConsoleInput转换为正确的函数。 但是,当您像这样在运行时加载函数时,必须确切指定所需的函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM