RTLCopyMemory在Vista中有效吗?

时间:2009-12-20 21:45:58

标签: winapi com vb6 windows-vista

我注意到RTL Move 内存似乎工作得很好。但是当我尝试使用RTL Copy Memory时,我得到:“在kernel32中找不到DLL入口点RtlCopyMemory”。这是我的声明:

Private Declare Sub CopyMem Lib "kernel32" Alias "RtlCopyMemory" ( _
    ByVal dest As Long, _
    ByVal source As Long, _
    ByVal bytLen As Long)

3 个答案:

答案 0 :(得分:5)

RtlCopyMemoryprovided inline。它在winnt.h中定义为memcpy。这意味着它不包含在Win32 DLL中,它是C运行时库的一部分。您可以尝试从memcpy导入c:\windows\system32\msvcrt.dll

答案 1 :(得分:3)

为什么不使用RtlMoveMemory?它的工作方式与RtlCopyMemory类似,只是它以不同的方式处理重叠的内存。

Bruce McKinney pioneered使用RtlMoveMemory超过10年,从那以后它一直是standard用于VB6内存复制。

答案 2 :(得分:1)

我知道这是一个老问题,但我遇到了同样的问题,所以我想我可以回答。

kernel32.dll中的RtlCopyMemory应该是Export Forward到ntdll, 但不知何故,人们在MS missed that one <罢工>的x64版Vista上(不知道它是如何在x86上)(见下文)。

如果只是出于您的需要,您可以尝试直接从ntdll导入它。

编辑:我的意思是不导出方法,但是使用符号它在ntdll中可以看作 RtlCopyMemoryNonTemporal

EDIT2:只是为了确定我已经检查了一些事情,这里是摘要:

  • RtlCopyMemory和RtlCopyMemoryNonTemporal都是从x64 Vista中的ntdll.dll导出的(普通版,SP1,SP2)
  • 在x64 Vista中的kernel32.dll中有RtlCopyMemory的导出转发
  • x86 Vista中的ntdll.dll中有未导出的 RtlCopyMemoryNonTemporal

如果您正在编写x64应用程序,那么一切都应该如此。

P.S。我错了x64 vs x86,因为我正在编译x86应用程序,并在x64上运行它(WOW模式), 所以它使用了32位版本的kernel32,ntdll而不是x64版本。