如何从Delphi XE5调用GetProcessAffinityMask

问题描述 投票:1回答:2

我尝试使用下面的代码片段在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代码示例没有使用指针。

delphi delphi-xe5
2个回答
2
投票

以下是德尔福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的指针)。


0
投票

而不是DWORD使用SIZE_T,将没有错误

© www.soinside.com 2019 - 2024. All rights reserved.