Adobe AIR执行程序

32
我希望能在Adobe AIR应用程序中按下一个按钮并执行某些已安装的程序。例如,我将拥有一个名为“启动Winamp”的按钮。当按下此按钮时,它应直接启动Winamp.exe……我不想执行一些命令行,我只想启动exe。或者……这是同一件事吗?请告诉我是否可能。
谢谢。

没有冒犯的意思,但这个问题已经被问过了。 - dkretz
6
@Le dorfier,哪里?我认为这是第一次提出这个问题。 - Dan Rosenstark
1
现在已经有了NativeProcess,您是否考虑修改已接受的问题? - Jono
10个回答

67

使用AIR 2.0,现在您可以:

if(NativeProcess.isSupported)
{
    var file:File = File.desktopDirectory;
    file = file.resolvePath("StyleLookupold.exe");

    var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
    nativeProcessStartupInfo.executable = file;
    var process:NativeProcess = new NativeProcess();

    process.start(nativeProcessStartupInfo);

}

你还需要将此添加到你的描述文件中。

<supportedProfiles>extendedDesktop</supportedProfiles> 

描述符文件在哪里?我正在使用Flash CS5。 - Lucas
3
在Flash CS5中,您需要前往“文件> Adobe Air 2设置”。那里将有一个名为“配置文件”的部分,其中包含4个复选框。确保只勾选了“扩展桌面”复选框。请注意,不要改变原来的意思。 - JD Isaacks

11
没有直接的方法可以实现这个功能。尝试使用CommandProxy
仔细阅读博客文章。您需要创建两个不同的项目:一个本地操作系统可执行文件和一个AIR应用程序。本地可执行文件启动您的AIR应用程序。AIR应用程序再请求可执行文件处理操作系统级别的请求。
Google Code下载源代码,并创建两个项目--一个Visual Studio / Mono用于示例C# exe,另一个用于AIR应用程序。这里是一个链接,描述了如何设置前者。
在您的AIR应用程序的主MXML文件中,您需要执行以下操作:
  • 创建一个 CommandProxy 对象,添加一些事件侦听器,用于连接检测和 Command 的响应和错误。

  • 通过 connect 调用连接到本地exe

  • connect 的事件处理程序中,创建一个新的 Command,例如ScreenshotCommand,并执行它(通过 CommandProxy.execute 方法)

... 就是这样!
希望这可以帮助到您。

我真的不知道如何使它工作。你有一个可用的示例吗?谢谢。 - Manny Calavera
1
CommandProxy?你遇到了什么问题?我现在没有准备好,但明天晚些时候可以试一下。 - dirkgently
1
更新我的帖子。如果您有更多问题,请告诉我。 - dirkgently
1
这正是发生的事情。 - dirkgently
请参见以下的新解决方案,它已经内置到AIR中。 - Danny Beckett
显示剩余3条评论

4
答案分为两部分。第一,如果你真的必须运行一个.exe文件,唯一的方法就是使用命令代理。个人认为,在.Net/Mono中使用这种方法有点过度了。我不了解Mono,但要求用户安装.Net和AIR会吓跑他们中的大部分人。此外,如果我要求用户安装Mono,为什么不直接在Mono中编写UI呢...?
你可以用Ruby编写一个简单的命令代理,这样做实际上是跨平台且低麻烦的,只需要约5分钟(我刚刚做到了,如果你想要代码,请在这里评论我,我会发布它)。如果你想在启动后控制进程,则需要更严肃的努力。对于分发等方面,我认为Ruby会更容易。
另一方面,看看这个想法。Jeff建议从AIR发送URL请求。基本上,如果你的浏览器能够正确解释它,你就可以开始了。代码如下:
var request : URLRequest = new URLRequest('C:\\playlists\\test.m3u');

我认为,通过一些创意(特别是使用MIME类型),这个第二种解决方案甚至可能适用于Winamp(例如..,播放列表或其他内容)。
祝你好运,感谢你提出这个问题,虽然可能重复了,但Google只找到了这一个,所以你赢了 :)

3
AIR 2.0将具备此功能。预计在年底(2009年)发布测试版,并在2010年上半年正式发布。从AIR 2开始,开发人员将可以访问本地进程API,以调用和与本地机器上的本地应用程序通信。为了保持.air文件格式的跨平台性,利用本地进程API的应用程序必须部署为本地安装程序,如.exe和.dmg。AIR运行时SDK将包括支持生成基本本地安装程序的功能。请参考此链接了解更多信息。

3

FlourineFX是一个Web消息网关,与Air中的本地应用程序启动无关。 - JTtheGeek

1

另一种方法是在本地计算机上启动简单的Web服务器(在后台),并使用HTTPService调用它的方法。

后台Web服务器可以使用Python,例如: http://fragments.turtlemeat.com/pythonwebserver.php

它可以启动可执行文件并提供AIR无法实现的功能。

这样可以保持Flex代码干净,因为它只实现了REST接口,而Python(或其他语言)则完成了其余工作。您还可以从使用Python作为与SQLite数据库的接口或将整个Django作为Web服务器中获益。

唯一的缺点是服务器必须已在本地主机上运行并侦听某个端口(即81)。您可能可以通过在系统启动时启动服务器来完成此操作。

虽然不是最佳方法,但在某些情况下,它可能有助于您的项目,就像我一样。


1

请查看此博客文章:从AIR运行exe文件

简要概述:

“如果您确实需要运行外部exe文件,并且没有其他解决问题的方法,那么您将确保用户在启动AIR应用程序之前运行另一软件。”


1

目前,AIR 没有本地实现此功能的方法。不过,有一些选项:

  • Shu
  • Red5 在本地主机上运行
  • 创建在用户计算机上运行并使用 sockets 连接的服务。

0
在Mac OS X中,如果您想启动一个.app文件,则必须编写以下文件路径。(假设应用程序的名称为xxx)
if(NativeProcess.isSupported)
{
    //not correct
    //file = file.resolvePath("/Applications/xxx.app");

    //correct
    file = file.resolvePath("/Applications/xxx.app/Contents/MacOS/xxx");

    var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
    nativeProcessStartupInfo.executable = file;
    var process:NativeProcess = new NativeProcess();

    process.start(nativeProcessStartupInfo);

}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接