2015-11-17 126 views
0

我试着用下面的代码片段来调用windows api中的GetProcessAffinityMask。如何从Delphi XE5中调用GetProcessAffinityMask

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

在汇编我得到以下错误消息......

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

C++的语法API调用低于:

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

所以然后我将DWORD更改为PDWORD,但没有解决问题。

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

回答

1

这里是GetProcessAffinityMask()在Delphi的Winapi.Windows单元声明:

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

DWORDDWORD_PTR是不同的数据类型。 DWORD_PTR不是“指向DWORD的指针”,它实际上是一个“指针大小的DWORD”(32位系统上的4个字节,64位系统上的8个字节)。而在32位和64位系统上,DWORD总是4个字节。 Microsoft使用前缀P来指示指向类型的指针,并使用_PTR后缀指示类型本身取决于指针的字节大小。

德尔菲声明使用var参数,所以你必须完全匹配的数据类型:

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

即使你的C++声明的报价显示,参数是PDWORD_PTR(指针DWORD_PTR)。

+0

感谢您的帮助。另外,感谢您对命名约定的解释。我发现我需要增加对数据类型的理解,并且看到Delphi声明也很有帮助。我必须完全匹配类型声明,包括case。 DWord_Ptr不起作用。非常感谢您花时间。帮我。 –

+0

请参见[Windows数据类型](https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751.aspx)。另外,Delphi不是一个区分大小写的语言。 'DWord_Ptr'和'DWORD_PTR'是一样的东西。 –

相关问题