gpt4 book ai didi

ada - 没有控制台的 Gnat 创建过程

转载 作者:行者123 更新时间:2023-12-04 15:46:40 24 4
gpt4 key购买 nike

我需要一个将在后台静默运行但仍与当前用户的桌面交互且不是服务的应用程序。

我希望应用程序在不生成标准输出控制台的情况下启动。

在C中,好像是用Kernel32.dll中的FreeConsole完成的,所以我引入了函数:

procedure Free_Console
is
use System;

type Shared_Library_Function
is access function
return Interfaces.C.Int;
pragma Convention(Stdcall, Shared_Library_Function);
function To_Shared_Library_Function
is new Ada.Unchecked_Conversion(System.Address, Shared_Library_Function);

function Load_Library(
File_Name : in Interfaces.C.Char_Array)
return System.Address;
pragma Import(Stdcall, Load_Library, "LoadLibrary", "_LoadLibraryA@4");

function Get_Function_Address(
Module : in System.Address;
Function_Name : in Char_Array)
return System.Address;
pragma Import(stdcall, Get_Function_Address, "GetProcAddress", "_GetProcAddress@8");

Library : System.Address := Load_Library(To_C("kernel32.dll"));
Pointer : System.Address := Get_Function_Address(Library, To_C("FreeConsole"));
begin
if Pointer /= System.Null_Address then
declare
Result : Interfaces.C.Int := 1;
begin
Result := To_Shared_Library_Function(Pointer).all;
end;
else
-- TODO Handle Error
null;
end if;
end Free_Console;

这只会将进程与控制台分离,不会删除控制台。已找到有关此行为的详细信息 here

所以我试图跟踪窗口的句柄,然后对其进行 CloseHandle()。

function Get_Console_Handle
return System.Address
is
use System;
STD_INPUT_HANDLE : constant Interfaces.C.Unsigned_Long := -10;
STD_OUTPUT_HANDLE : constant Interfaces.C.Unsigned_Long := -11;
STD_ERROR_HANDLE : constant Interfaces.C.Unsigned_Long := -12;

type Shared_Library_Function
is access function(
Standard_Handle : Interfaces.C.Unsigned_Long)
return System.Address;
pragma Convention(Stdcall, Shared_Library_Function);
function To_Shared_Library_Function
is new Ada.Unchecked_Conversion(System.Address, Shared_Library_Function);

function Load_Library(
File_Name : in Interfaces.C.Char_Array)
return System.Address;
pragma Import(Stdcall, Load_Library, "LoadLibrary", "_LoadLibraryA@4");

function Get_Function_Address(
Module : in System.Address;
Function_Name : in Char_Array)
return System.Address;
pragma Import(stdcall, Get_Function_Address, "GetProcAddress", "_GetProcAddress@8");

Library : System.Address := Load_Library(To_C("kernel32.dll"));
Pointer : System.Address := Get_Function_Address(Library, To_C("GetStdHandle"));
begin
if Pointer /= System.Null_Address then
return To_Shared_Library_Function(Pointer).all(STD_OUTPUT_HANDLE);
else
return System.Null_Address;
end if;
end Get_Console_Handle;

--winbase.CloseHandle
function Close_Handle(
Object_Handle : in System.Address)
return Interfaces.C.Int;
pragma Import(Stdcall, "CloseHandle");

这也没有做任何事情。我敢打赌 Get_Console_Handle 会返回一个不正确的句柄。

我的问题是,是否有 Gnat 命令行选项可以不创建控制台窗口,或者是否有关闭控制台窗口的方法?

最佳答案

控制台窗口实际上不是 GNAT 特定的,更多的是 Windows 上的 GCC。

您可以使用 -Wl,-subsystem,windows-mwindows 使其不弹出。

关于ada - 没有控制台的 Gnat 创建过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11351191/

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