Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 如何从Ada代码控制win32中的cmd窗口?_Lua_Ada_Cmd - Fatal编程技术网

Lua 如何从Ada代码控制win32中的cmd窗口?

Lua 如何从Ada代码控制win32中的cmd窗口?,lua,ada,cmd,Lua,Ada,Cmd,我在Ada中做了一个简单的Lua执行,它通过Lua.Load\u Buffer(“os.execute('wxlua.exe wx.Lua')”)”运行我需要的所有东西,但我不需要win32 cmd.exe-window,它是程序启动时默认打开的窗口。有没有办法直接从Ada控制这起事件 p.S.os.execute()直接将命令发送到Windows,而不是通过cmd.exe。若要帮助查看发生了什么,请尝试创建执行该命令的桌面快捷方式 如果双击它也会显示win32 cmd.exe窗口,则意味着他们

我在Ada中做了一个简单的Lua执行,它通过
Lua.Load\u Buffer(“os.execute('wxlua.exe wx.Lua')”)”
运行我需要的所有东西,但我不需要win32 cmd.exe-window,它是程序启动时默认打开的窗口。有没有办法直接从Ada控制这起事件


p.S.os.execute()直接将命令发送到Windows,而不是通过cmd.exe。

若要帮助查看发生了什么,请尝试创建执行该命令的桌面快捷方式

如果双击它也会显示win32 cmd.exe窗口,则意味着他们将wxlua.exe编译为windows控制台应用程序。你可以试着阅读他们的文档,或者在他们的exe目录中翻找,看看是否有Win32版本。如果这对您不起作用,我所知道的您剩下的最好的选择是使用集合调用Win32,而不是使用操作系统执行

如果快捷方式没有打开控制台窗口,则表示
os.execute
正在对您执行此操作。在这种情况下,您必须直接转到上面提到的CreateProcess解决方案

Gnat应该附带调用CreateProcess所需的Win32绑定。如果您希望该例程有一个更干净的接口,我创建了一些更厚的绑定到一些Win32调用,包括那个调用和一些与创建Win32服务相关的其他调用。我将它们发布到公共领域(或试图…)它们可以在我的旧版本的源代码发行版中找到,我相信它们在的示例目录中(至少在ACT接管之前是这样)。

标准Lua调用标准C函数
system()
。C标准只要求
system()
做一些依赖于平台的事情,并且特别避免说明可能是什么。在类Unix平台上,
system()
通常调用shell
/bin/sh
。在Windows上,它通常调用
cmd.exe

当然,它的确切实现可能取决于您使用的确切工具链。你还没有说你的Lua是从哪里来的(或者说,你有谁)。一个可能的和推荐的源代码是,它链接到VC8中的C运行时库,也称为VS2005。引述自:

int系统(const char*命令)

。。。。系统功能将命令传递给 命令解释器 将字符串作为 操作系统命令<代码>系统
指的是
COMSPEC
路径
用于定位 命令解释器文件(文件 在Windows NT和 稍后)。如果
命令
,则 函数只检查 命令解释器存在

由于调用
cmd.exe
os.execute
调用
system
,您将获得控制台窗口。避免这种情况的方法是不要使用
os.execute

如果正在执行的程序是针对Windows控制台模式编译的,那么不管怎样,您都会得到一个控制台窗口。但是,
wxlua.exe
几乎肯定不会作为控制台应用程序进行编译,因为它的目的是托管基于库用Lua编写的GUI应用程序

编辑: 当然,如果您的lua.exe是以某种方式构建的,用不同的实现替换了
os.execute
的实现或标准库例程
system()
,那么您可能会看到不同的结果

要演示标准Lua的
os.execute()
最终调用
cmd.exe
,请尝试以下操作:

C:\Documents and Settings\Ross>lua -e "os.execute[[pause]]" Press any key to continue . . . C:\Documents and Settings\Ross>wlua -e "os.execute[[pause]]" C:\Documents and Settings\Ross> 请注意,调用Lua的CMD实例有一个子CMD

再次使用
wlua-e“os.execute[[pause]]”和pslist-t重复该实验:

C:\Documents and Settings\Ross>pslist -t .... Name Pid Pri Thd Hnd VM WS Priv Idle 0 0 2 0 0 16 0 ... explorer 3592 8 16 1251 115712 33956 25752 ... cmd 4300 8 1 96 35032 4448 2260 PsList 4888 13 2 109 29556 2780 1248 procexp 4800 13 7 328 108492 33232 29464 cmd 5208 8 1 32 30340 2704 1984 wlua 3272 8 1 15 8536 1576 400 cmd 5104 8 1 30 30144 2440 1956 C:\Documents and Settings\Ross>pslist-t .... 名称Pid Pri Thd Hnd VM WS Priv 空闲0 0 2 0 16 0 ... 探险家3592 8 16 1251 115712 33956 25752 ... cmd 4300 8 1 96 35032 4448 2260 PsList 4888 13 2 109 29556 2780 1248 procexp 4800 13 7 328 108492 33232 29464 cmd 5208 8 132 30340 2704 1984 wlua 3272811585361576400 cmd 5104 8 1 30 30144 2440 1956 同样,
wlua
的子级有一个CMD


使用Sysinternals,我可以看到子
CMD
进程的命令行。它是
CMD.EXE/C pause
。实际上,
system()
CMD/C
前置到它的参数,并将结果传递给
spawn()
,以便在子进程中执行。

好吧,我没有找到你的链接,但我找到了很多有用的材料,例如:Win绑定、许多代码示例等。总之,非常感谢你@Archinamon-我自己还没有使用过它,但gnavi的东西似乎至少还处于半主动开发阶段,所以它可能应该在我推荐的列表中。好吧,os.execute即使在standart Lua中也不会像我在测试中引用的那样调用cmd.exe。我的Ada应用程序总是调用cmd.exe,即使我根本不使用LuaAda。我有GNAT2010(4.4.1)编程工作室,我在那里编译我所有的项目,还有最新的Lua5.1.4的LuaAda绑定。不幸的是,我没有找到Ada的wxWindgets,所以我使用os.execute在wxlua.exe下启动脚本。@Archinamon,我在回答中添加了一些示例来解释我的说法,即
CMD
os.execute
调用。我根本不会说Ada,也没有LuaAda的经验。如果您可以找到一种从Ada生成子进程的方法,而无需调用C运行时的
system()
,那么 C:\Documents and Settings\Ross>pslist -t .... Name Pid Pri Thd Hnd VM WS Priv Idle 0 0 2 0 0 16 0 ... explorer 3592 8 16 1251 115712 33956 25752 ... cmd 4300 8 1 96 35032 4448 2260 PsList 4888 13 2 109 29556 2780 1248 procexp 4800 13 7 328 108492 33232 29464 cmd 5208 8 1 32 30340 2704 1984 wlua 3272 8 1 15 8536 1576 400 cmd 5104 8 1 30 30144 2440 1956