如何从Delphi XE5调用GetProcessAffinityMask

时间:2015-11-17 21:34:43

标签: delphi delphi-xe5

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

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

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

  

[dcc32错误] UnitfrmMain.pas(54):E2033实际和正式var参数的类型必须相同

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

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

然后我将DWORD更改为PDWORD,但是没有修复它。

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

2 个答案:

答案 0 :(得分:2)

以下是Delphi的GetProcessAffinityMask()单位Winapi.Windows的声明:

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

DWORDDWORD_PTR是不同的数据类型。 DWORD_PTR不是“指向DWORD的指针”,它实际上是“指针大小的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的指针)。

答案 1 :(得分:0)

代替DWORD使用SIZE_T,不会有错误