如何从 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;
DWORD
和 DWORD_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,不会有错误
我尝试使用下面的代码片段在 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;
DWORD
和 DWORD_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,不会有错误