Perl6/乐
我想创建一个子程序,只允许将某些值传递给它。并且不传递允许的值将创建检查器错误(perl6 -c)。
我该怎么做呢?
非常感谢,-T
嗨,雷夫,
在我的 WinPopUps 模块中,我使用了“where”方法,因为它可以一目了然地告诉用户允许的值是什么。我喜欢它!这都是关于可维护性的!(顺便说一句,下面是你创造的怪物!)
sub WinPopUp( Str $TitleStr,
Str $MessageStr,
Str $Icons where * ~~ "Exclamation" |
"Warning" |
"Information" |
"Asterisk" |
"Question" |
"Stop" |
"Error" |
"Hand",
Str $Buttons where * ~~ "AbortRetryIgnore" |
"CancelTryAgainContinue" |
"Help" |
"Ok" |
"OkCancel" |
"RetryCancel" |
"YesNo" |
"YesNoCancel" )
is export( :WinPopUp ) {
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助!-T
让我知道你是否想要整个模块以及在哪里发布它
视窗
使用 Raku/Perl6,如何使用 NativeCall 读取值
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\"EnableLUA"]
使用 RegQueryValueExW?
https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regqueryvalueexw
非常感谢,
-T
编辑 12-27-2019 #1:删除错误代码并插入新代码
这就是我得到的程度。
测试运行字符串:K:\Windows\NtUtil>perl6 -I。-e "使用 WinMount :GetLUA; 说 GetLUA();" RegOpenKeyExW RegOpenKeyExW RtnCode 0
RegQueryValueExW
1
2
RegQueryValueExW RtnCode 87 (87 = ERROR_INVALID_PARAMETER)
lpData pointer 0
lpcbData data length 0
RegCloseKey
RegCloseKey RtnCode 0
True
Run Code Online (Sandbox Code Playgroud)
WinMount.pm6
# unit module WinMount;
# WinMount.pm6#`{
Utilities to mount and dismound drive partitions
Note: LUA must be unset (0x00000000) for mount to function prpoperly
raku -I. -c WinMount.pm6
}
use NativeCall;
use …
Run Code Online (Sandbox Code Playgroud) https://docs.perl6.org/language/nativecall
"As you may have predicted by now, a NULL pointer
is represented by the type object of the struct type."
Run Code Online (Sandbox Code Playgroud)
https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regqueryvalueexw
C++
LSTATUS RegQueryValueExW(
HKEY hKey,
LPCWSTR lpValueName,
LPDWORD lpReserved,
LPDWORD lpType,
LPBYTE lpData,
LPDWORD lpcbData
);
lpReserved
This parameter is reserved and must be NULL.
Run Code Online (Sandbox Code Playgroud)
使用“本机”,我如何满足“NULL”要求?
constant WCHAR := uint16;
constant DWORD := int32;
sub RegQueryValueExW( DWORD, WCHARS, DWORD, DWORD, DWORD is rw, DWORD is rw ) is native("Kernel32.dll") returns DWORD { * };
$RtnCode = RegQueryValueExW( $Handle, …
Run Code Online (Sandbox Code Playgroud) $ raku -v 这是基于 MoarVM 版本 2019.07.1 构建的 Rakudo 版本 2019.07.1
以下是在 Raku REPL 上完成的。我在这里做错了什么?如何为 CArray[WCHAR] 赋值?
我希望 $lpData[0] 为 0xABCD,$lpData[1] 为 0xEF12。
> use NativeCall;
Nil
> constant WCHAR := uint16;
(uint16)
> my $ValueData = 0xABCDEF12;
2882400018
> my CArray[WCHAR] $lpData;
(CArray[uint16])
> $lpData[ 0 ] = ( $ValueData +& 0xFFFF0000 ) +> 0x10;
Type check failed in assignment to $lpData; expected NativeCall::Types::CArray[uint16] but got Array ($[])
in block <unit> at <unknown file> line 1
> $lpData[ 1 …
Run Code Online (Sandbox Code Playgroud) 软呢帽 33 乐
我正在尝试使用 Raku 的 NativeCall 与 libX11.so 对话以打印出我的屏幕和显示:
use NativeCall;
class Display is repr('CStruct') { has Pointer $.DisplayPtr };
# libX11.so --> X11
sub XOpenDisplay(Str $name = ':0') returns Display is native('X11') { * }
sub XDefaultScreen(Display $) returns int32 is native('X11') { * }
my Display $display = XOpenDisplay()
or die "Can not open display";
my int $screen = XDefaultScreen($display);
print "display = <" ~ $display ~ ">\n";
print "screen = <" ~ $screen ~ ">\n";
$ …
Run Code Online (Sandbox Code Playgroud) 这是一个NativeCall问题。
我有 8 个字节(小端)表示CArray
内存地址。我如何创建一个Pointer
出来呢?
(CArray
和Pointer
是 NativeCall 的两种 C 兼容类型。 s 长 8 个字节。事情应该排成一行,但是如何以 NativeCall 可接受的方式Pointer
将 a 中的指针地址放入 aCArray
中?)Pointer
我正在尝试编写一个测试方法来打印以度数给定的角度的余弦值。
我最终想要的是能够解决以下问题
say 45.AngleCosine;
Run Code Online (Sandbox Code Playgroud)
没有 .new 的东西,比如
say .7.cos;
Run Code Online (Sandbox Code Playgroud)
我如何放弃 .new 的东西?
这是我到目前为止:
class Angle {
has Numeric $.degrees;
method AngleCosine( $debug = False ) {
my Str $SubName = &?ROUTINE.name;
my Numeric $radians = self.degrees * ? / 180;
my Numeric $cosine = $radians.cos;
if $debug {
print "$SubName debugging:\n";
print " self = <" ~ self.degrees ~ ">\n";
print " radians = <$radians>\n";
print " Cosine of " ~ self.degrees ~ " degrees is <" ~ $cosine ~ …
Run Code Online (Sandbox Code Playgroud) 我正在使用Windows 7和10 rakudo-star-2019.03-x86_64 (JIT)
。我想知道如何在Perl6中创建一个弹出窗口来向用户提供信息?类似于Linux的send-notify或Windows Pro msg(无网络连接)
非常感谢,-T
你会如何用 Raku/Perl6 的 Native Call 调用这个库?
https://developer.gnome.org/gtk3/stable/gtk3-Clipboards.html#gtk-clipboard-request-text
void
gtk_clipboard_request_text (GtkClipboard *clipboard,
GtkClipboardTextReceivedFunc callback,
gpointer user_data);
Run Code Online (Sandbox Code Playgroud)
非常感谢,-T
编辑:这个问题是如何调用函数。不要对失败的呼叫进行故障排除。此时没有编写代码。
软呢帽 33 乐
我想用 NativeCall 与 lic.so.6 交谈,以我正在编写的示例为例。我已经找到
但我不知道哪一个会给我一天中的时间 (21:02:03)