【问题标题】:Does Raku's NativeCall run "LocalFree( )"?Raku 的 NativeCall 是否运行“LocalFree( )”?
【发布时间】:2020-01-07 14:39:49
【问题描述】:

Raku/Perl6、Windows 7 和 10

Raku 的 NativeCall 在创建缓冲区后是否运行“LocalFree( )”?还是我需要自己做? https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-localfree

非常感谢,-T

编辑:这是 JJ 的要求。

https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regsetvalueexw

C++
    LSTATUS RegSetValueExW(
    HKEY        hKey,
    LPCWSTR     lpValueName,
    DWORD       Reserved,
    DWORD       dwType,
    const BYTE  *lpData,
    DWORD       cbData
  );

在汇编代码中:

 lea eax,[@@lMode]
 call RegSetValueExA,HKEY_CURRENT_USER,offset 
[@@VAL_Type],0,REG_DWORD,eax,DWORD

"offset [@@VAL_Type]" -> 指向键值字符串缓冲区的指针 “eax” -> 指向数据的指针(在缓冲区“@@lMode”中)

"*lpData" 和"@@lMode" 是内存中分配空间中的缓冲区。使用后,需要通过“LocalFree”将其内存回馈给系统。

所以换个说法,当 NativeCall 在内存中为缓冲区分配空间时,它是在完成后归还空间,还是将其留在那里(内存泄漏)?

那么,我需要调用“LocalFree()”还是 NativeCall 为我处理它?

【问题讨论】:

  • 你真的需要澄清这个问题。请发布一个带有输出的示例程序,我们可能会想出一个答案。尽管简短的回答可能是否定的,但 NativeCall 除了提供一种使用本机 C 函数和数据结构的方法之外,并没有为您做任何事情。
  • 嗨,Håkon,我还没有调用 RegSetValueExW。我仍在为 *lpData 的缓冲区设置 C 字符串和小端。而且,这实际上不是我问这个问题的原因。我想知道的是,在我对 RegSetValueExW 的调用正常工作后,我是否还需要调用“LocalFree()”。顺便说一句,文档在将 Raku 字符串转换为 C 字符串时是不正确的,因为它没有在末尾添加 nul。我完成后你想看看代码吗?
  • 我的问题是关于本地调用的内部工作,而不是如何调用 RegSetValueExW
  • OT:嗨,Håkon,我正在撰写自己的论文,描述如何将 NativeCall 与 WinAPI 调用一起使用。它有 300 多行并且还在增长。完成后不知道在哪里发布。可能是 Git。你也想要一份吗?
  • @Todd 现在可能更混乱了。简短的回答仍然是不,NativeCall 只是调用 C 代码的粘合剂,所以它根本不会为你调用任何东西,除非 C 代码这样做。

标签: raku


【解决方案1】:

如果你已经明白了……

  • NativeCall 所做的是调用 C 函数。 不是 NativeCall 的角色是分配或释放内存。

  • LocalFree 是一个 C 函数。从 Raku 调用 C 函数的常规方法是通过 NativeCall。

...那么您可以放心地忽略这个答案——以及作为答案的问题,以及托德的答案。

如果您对上述内容有信心,那么也许这个答案会消除任何困惑并减少您被误导的机会。我在下面写的是悬而未决的。但我觉得确保清晰是合适的。

Raku 的 NativeCall 是否运行“LocalFree( )”?

是的,如果你告诉它。

NativeCall 是通常用于从 Raku 调用 C 函数的功能。1

Raku 的 NativeCall 在创建缓冲区后是否运行“LocalFree( )”?

NativeCall 不会自行创建缓冲区。 NativeCall 所做的只是按照用户代码的指示调用 C 函数。

假设您使用 NativeCall 调用创建缓冲区的 C 函数。这是否意味着 NativeCall 创建了缓冲区?还是? (类似地,如果在使用 NativeCall 调用创建缓冲区的 C 函数之后使用 NativeCall 调用 LocalFree,这是否意味着对 Todd 的问题的答案是肯定的?如果不是,这是否意味着答案是否定的? )

您可以使用 NativeCall 来调用LocalFree,因为 LocalFree 是一个 C 函数,而调用 C 函数正是您使用 NativeCall 做某事时所做的。2

还是需要我自己做?

根据您对以上几段括号中的问题的回答...

鉴于 NativeCall 不创建缓冲区,您不能需要做任何与 NativeCall 创建缓冲区相关的事情。

另外,如果 NativeCall 创建缓冲区,那是因为您使用它来手动调用创建缓冲区的 C 函数,因此如果需要,您还需要手动调用 C 函数来释放这些缓冲区他们被释放了。

脚注

1 NativeCall 是 Raku C FFI

2 无论您“使用”什么 NativeCall,您都将从 use NativeCall 语句开始。然后,您通常会使用它来调用 C 函数。您可能会 use 它只访问它定义的一些常量。

【讨论】:

    【解决方案2】:

    NativeCall 不会关闭任何 WinApi 调用缓冲区,因此需要您自己完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多