【问题标题】:Perl6 NativeCall with Str is encoded('utf16') got randomly corrupted resultPerl6 NativeCall with Str iscoded('utf16') 得到随机损坏的结果
【发布时间】:2018-12-09 10:57:32
【问题描述】:

我正在使用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"

[EDIT] 多次调用的结果:

[12] => D:\dev\pa.t

[12] => D:\dev\pa.

[12] => D:\dev\pa.槟

[9] => D:\dev\pa

[9] => D:\dev\pa

还有其他合适的方法吗?

【问题讨论】:

  • 我认为它可能附加了一个 8bit null,这对 utf8 很好;问题是这是utf16。我认为这是 NativeCall 中的一个错误。

标签: utf-16 raku nativecall


【解决方案1】:

我怀疑 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

【讨论】:

  • 谢谢,接缝就是这样。我会尽快尝试的。
猜你喜欢
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
相关资源
最近更新 更多