【发布时间】:2019-04-17 11:08:34
【问题描述】:
当程序编译为 64 位时,WinAPI 函数AttachConsole 始终返回 true。
首先,我将函数声明如下:
function AttachConsole(dwProcessId: DWORD): Bool; stdcall; external KERNEL32 name 'AttachConsole';
然后我调用我的函数:
if AttachConsole(DWORD(-1)) then
....
当编译为 32 位应用程序时,这可以正常工作,但当编译为 64 位应用程序时,它总是返回 true。
documentation 没有提到为 64 位应用程序做一些特殊的事情。
如何重现:
- 创建一个新的 VCL 应用程序
- 将目标平台设置为 Win64
- 将 DPR 文件编辑为如下所示:
program Project1;
uses
System.Types,
WinApi.windows,
Vcl.Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
function AttachConsole(dwProcessId: DWORD): Bool; stdcall; external KERNEL32 name 'AttachConsole';
begin
if AttachConsole(DWORD(-1)) then
begin
writeLN('Hello world');
Exit;
end;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
在 Win64 下运行时,AttachConsole 即使在资源管理器中运行也会返回 true。
【问题讨论】:
-
也许,只是也许,64 位编译器对
DWORD(-1)做了一些奇怪的事情——你用$FFFFFFFF试过了吗? -
是相同的结果:误报。
-
如果您附加二进制代码而不是 src,则更有用