如何从 Delphi XE5 调用 GetProcessAffinityMask

How to call GetProcessAffinityMask from Delphi XE5

我尝试使用下面的代码片段在 windows api 中调用 GetProcessAffinityMask。

var 
  procaffmask, 
  sysaffmask       : DWord;
begin
  GetProcessAffinityMask(GetCurrentProcess, procaffmask, sysaffmask);
end;

编译后我得到以下错误信息......

[dcc32 Error] UnitfrmMain.pas(54): E2033 Types of actual and formal var parameters must be identical

API 调用的 C++ 语法如下:

BOOL WINAPI GetProcessAffinityMask(
  _In_  HANDLE     hProcess,
  _Out_ PDWORD_PTR lpProcessAffinityMask,
  _Out_ PDWORD_PTR lpSystemAffinityMask
);

然后我将 DWORD 更改为 PDWORD,但这并没有解决它。

谁能告诉我如何解决这个问题?我在互联网上看到 Delphi 个不使用指针的代码示例。

这里是 Delphi 的 Winapi.Windows 单元中 GetProcessAffinityMask() 的声明:

function GetProcessAffinityMask(hProcess: THandle;
  var lpProcessAffinityMask, lpSystemAffinityMask: DWORD_PTR): BOOL; stdcall;

DWORDDWORD_PTR 是不同的数据类型。 DWORD_PTR 不是 "pointer to a DWORD",它实际上是 "pointer-sized DWORD"(32 位系统上为 4 个字节,64 位系统上为 8 个字节)。而 DWORD 在 32 位和 64 位系统上始终为 4 个字节。 Microsoft 使用 P 前缀表示指向类型的指针,并使用 _PTR 后缀表示类型本身取决于指针的字节大小。

Delphi 声明使用了 var 参数,因此您必须准确匹配数据类型:

var 
  procaffmask, 
  sysaffmask       : DWORD_PTR;
begin
  GetProcessAffinityMask(GetCurrentProcess, procaffmask, sysaffmask);
end;

甚至你对 C++ 声明的引用也表明参数是 PDWORD_PTR(指向 DWORD_PTR 的指针)。

用SIZE_T代替DWORD,不会有错误