有MAKELONGLONG功能吗?

时间:2010-08-12 19:57:10

标签: windows winapi

我需要组合两个32位值来创建64位值。我正在寻找类似于MAKEWORDMAKELONG的内容。我可以轻松定义自己的宏或函数,但如果API已经提供了一个,我宁愿使用它。

2 个答案:

答案 0 :(得分:3)

我在Windows API中找不到任何内容。但是,我知道你使用Delphi主要(或者至少很多)工作,所以这里有一个快速的Delphi函数:

function MAKELONGLONG(A, B: cardinal): UInt64; inline;
begin
  PCardinal(@result)^ := A;
  PCardinal(cardinal(@result) + sizeof(cardinal))^ := B;
end;

更快:

function MAKELONGLONG(A, B: cardinal): UInt64;
asm
end;

说明:在正常的register调用约定中,前两个参数(如果基数大小)分别存储在EAX和EDX中。 (基数大小)结果存储在EAX中。现在,64位结果存储在EAX(低有效位,低地址)和EDX(更高有效位,高地址)中;因此我们需要将A移至EAX并将B移至EDX,但它们已经存在!

答案 1 :(得分:0)

我个人更喜欢C-macros

#define MAKE_i64(hi, lo)    (  (LONGLONG(DWORD(hi) & 0xffffffff) << 32 ) | LONGLONG(DWORD(lo) & 0xffffffff)  )