首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NativeCall在Kernel32.dll中找不到函数

NativeCall在Kernel32.dll中找不到函数
EN

Stack Overflow用户
提问于 2019-08-21 07:49:47
回答 1查看 173关注 0票数 6

我正在尝试将this code移植到Perl6。虽然我可以调用GetStdHandleGetConsoleModeSetConsoleMode,但当我尝试调用ReadConsoleInput时,脚本就会中断

代码语言:javascript
复制
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

现在,这个函数是definitly there。它有一个复杂的签名,但我不确定我的脚本中的签名是否正确。这可能是原因吗?NativeCall会看签名吗?

这就是我在代码中定义sub的方式(注释取自MS文档)

代码语言:javascript
复制
#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 { * };

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-21 08:13:16

实际的函数名是ReadConsoleInputA还是ReadConsoleInputW,这取决于您想要的是ANSI还是Unicode (UTF16)输入。C标头包含一些宏,可以根据预处理器符号将ReadConsoleInput自动转换为正确的函数。但是当你像这样在运行时加载函数时,你必须准确地指定你想要的函数。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57582796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档