我尝试使用下面的代码片段在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代码示例没有使用指针。
以下是德尔福GetProcessAffinityMask()
单位中Winapi.Windows
的声明:
function GetProcessAffinityMask(hProcess: THandle;
var lpProcessAffinityMask, lpSystemAffinityMask: DWORD_PTR): BOOL; stdcall;
DWORD
和DWORD_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
的指针)。
而不是DWORD使用SIZE_T,将没有错误