gpt4 book ai didi

delphi - AttachConsole 和 64 位应用程序

转载 作者:行者123 更新时间:2023-12-03 14:58:39 29 4
gpt4 key购买 nike

当程序编译为 64 位时,WinAPI 函数 AttachConsole 始终返回 true。

首先,我将函数声明如下:

function AttachConsole(dwProcessId: DWORD): Bool; stdcall; external KERNEL32 name 'AttachConsole';

然后我调用我的函数:

if AttachConsole(DWORD(-1)) then
....

当编译为 32 位应用程序时,此方法工作正常,但当编译为 64 位应用程序时,它始终返回 true。

documentation没有提到为 64 位应用程序做一些特殊的事情。

如何重现:

  1. 创建新的 VCL 应用程序
  2. 将目标平台设置为 Win64
  3. 编辑 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。

最佳答案

来自 documenation链接,dwProcessId [in] 可以采用两种类型的值 - 目标进程的 PID 或特殊参数:

ATTACH_PARENT_PROCESS (DWORD)-1

Use the console of the parent of the current process.

此处您使用值ATTACH_PARENT_PROCESS

在 64 位调试的情况下,IDE 似乎正在为 64 位调试器创建一个控制台,该控制台将调试的应用程序作为子代进行托管,因此选择连接到父控制台会成功。

对于 32 位调试 session ,应用程序作为 IDE 的子级生成。我们可以猜测这是因为IDE本身是32位应用程序,可以直接挂接到32位进程,而64位应用程序必须附加到64位调试器。

使用进程资源管理器,我们可以在 IDE 中启动进程进行调试时看到进程层次结构的差异:

enter image description here

enter image description here

在这里我们可以看到 64 位进程作为子进程托管在调试器内核中,而 32 位进程则不是。

在调试器外部运行(64 位)应用程序会产生预期结果,但 AttachConsole(ATTACH_PARENT_PROCESS) 失败。

关于delphi - AttachConsole 和 64 位应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55726166/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com