首页 文章

带有Str的Perl6 NativeCall被编码('utf16')得到随机损坏的结果

提问于
浏览
4

我使用 NativeCall 在perl6脚本中映射 GetFullPathName windows API,因此我编写了以下内容:

#!perl6
use NativeCall;
constant \WIN32_MAX_PATH = 260;    

#I may use directly $path.IO.absolute()
sub Win32-GetFullPathName(
        Str $lpFileName is encoded('utf16'),
        int32 $nBufferLength, 
        #Str $lpBuffer is encoded('utf16') is rw,
        Blob $lpBuffer is rw,
        Str $lpFilenameIndex is rw)
    returns int32
    is native('kernel32.dll') 
    is symbol('GetFullPathNameW') 
    { * }


my $path = '.';
my $fp-size = Win32-GetFullPathName(
        $path, # $path ~ "\0", # <!-- this hack make it working fine
        WIN32_MAX_PATH, 
        #my Str $fpath = ' ' x WIN32_MAX_PATH;
        my $buffer = buf16.allocate(WIN32_MAX_PATH), 
        Str );
put "[$fp-size] => ", $buffer.decode('utf16').substr(0, $fp-size);

代码随机工作,直到我在 $path 之后追加 "\0" .

[编辑]多次调用时的结果:

[12] => D:\ dev \ pa.t [12] => D:\ dev \ pa . [12] => D:\ dev \pa.μºƒ[9] => D:\ dev \ pa [9] => D:\ dev \ pa

还有其他正确的方法吗?

1 回答

  • 2

    我怀疑 src/strings/utf16.c 中有一个MoarVM错误,特别是line 403

    result = MVM_realloc(result, *output_size);
    

    应该读一下

    result = MVM_realloc(result, *output_size + 2);
    

    如果您可以验证这可以解决您的问题,请随意file a bug report甚至create a pull request .

相关问题