我尝试使用下面的代码片段在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代码示例没有使用指针。
答案 0 :(得分:2)
以下是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
的指针)。
答案 1 :(得分:0)
代替DWORD使用SIZE_T,不会有错误