【发布时间】: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