使用aperture框架让AS3与C++通信,执行本地代码

我们都知道,AIR的效果是非常出色的,这也是大家喜欢她的原因,可是她的本地代码控制能力却是非常的弱,我们所做的好多试图将AIR本地化的努力最终不得不以失败而告终,其惨痛无以言表。

  现在,aperture框架来了,我们不再痛苦了,我们用AS3与 C++完美结合,做出功能与效果兼具的软件成为可能。

  本篇文章利用aperture框架让AS3使用windows的动态链接库(dll)文件。

  aperture框架下载地址:http://aperture.fluorinefx.com/

  好了,让我们开始吧。

  1.安装aperture框架(我的是安装在D:\Program Files\FluorineFx Aperture)。

  2.创建dll文件。

    A)打开vs2008,创建一个ATL项目,如下图所示:

使用aperture框架让AS3与C++通信,执行本地代码

项目名称为:Test,单击“确定”创建项目。

    B)在应用程序设置 面板中选择“动态链接库”和“允许合并代理/存根(stub)代码”,如下图所示:

使用aperture框架让AS3与C++通信,执行本地代码

单击 完成 创建此项目。

    C)在“解决方案资源管理器”中右击“Test”选择菜单如:“添加”->“类”,打开添加类面板,选择“ATL简单对象”,如下图所示:

使用aperture框架让AS3与C++通信,执行本地代码

    D)单击“添加”按钮打开向导面板,输入类名称为“MyTest”,如下图所示:

使用aperture框架让AS3与C++通信,执行本地代码

单击“完成”就创建了一个类。

    E)在类视图中右击“IMyTest”接口,选择“添加”->“添加方法”,打开添加方法面板,方法名为Runcmd,分别添加传入传出参数如下图所示:

使用aperture框架让AS3与C++通信,执行本地代码

单击“完成”添加一个方法。

    F)打开“MyTest.cpp”,在相应的方法中添加实现代码,如下:

// MyTest.cpp : CMyTest 的实现

#include "stdafx.h"
#include "MyTest.h"
#include <comdef.h>


// CMyTest


STDMETHODIMP CMyTest::Runcmd(BSTR cmd, BSTR* result)
{
_bstr_t bs=cmd;
char* ch=bs;
system(ch);
*result=_bstr_t("已经成功执行了cmd");
return S_OK;
}
G)右击“MyTest”工程,选择生成,则会生成一个Test.dll文件,打开MyTest.rgs文件,如下所示:

HKCR
{
Test.MyTest.1 = s 'MyTest Class'
{
CLSID = s '{1980D42B-26C0-48C0-9DCB-76EA41DBFF5A}'
}
Test.MyTest = s 'MyTest Class'
{
CLSID = s '{1980D42B-26C0-48C0-9DCB-76EA41DBFF5A}'
CurVer = s 'Test.MyTest.1'
}
NoRemove CLSID
{
ForceRemove {1980D42B-26C0-48C0-9DCB-76EA41DBFF5A} = s 'MyTest Class'
{
ProgID = s 'Test.MyTest.1'
VersionIndependentProgID = s 'Test.MyTest'
ForceRemove 'Programmable'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
'TypeLib' = s '{2E593994-C270-4D5D-9023-7943B0C37F99}'
}
}
}
记录下MyTest的Class id 1980D42B-26C0-48C0-9DCB-76EA41DBFF5A

  3.打开FlashCS4,创建一个AIR工程,为此工程创建文档类Main.as,在此类中输入以下代码:

package
{
import cn.asmax.aperture.LocalObject;
import cn.asmax.aperture.LocalObjectEvent;
import flash.display.Sprite;

/**
* ...
* @author Jaja as-max.cn
*/
public class Main extends Sprite
{
private var lc:LocalObject = LocalObject.localObject;

public function Main():void
{
lc.source = "Test:1980D42B-26C0-48C0-9DCB-76EA41DBFF5A";
lc.addEventListener(LocalObjectEvent.RESULT, onResult);
lc.Runcmd("notepad");
}

private function onResult(event:LocalObjectEvent):void {
switch(event.methodName) {
case "Runcmd":
trace(event.result);
break;
}
}

}

}

  说明:类中所使用的LocalObject类和相应的事件类是本人根据aperture框架封装的纯AS3类,此类可以在flash、flex和纯as3工程中使用,比aperture自带的类使用更方便。这两个类可在示例代码中找到。

  编译AIR程序。

  4.将aperture安装目录中Debug目录下的msi.dll、fluorinepp.dll、Console.exe复制到AIR工程 目录中,再将我们的Test.dll也复制到此目录中,双击Console.exe运行调试程序,再执行我们的AIR程序,就可以看到效果了。

  5.然后在打包程序时将msi.dll、fluorinepp.dll、Test.dll一起打包进去。

你可能感兴趣的:(C++,c,框架,C#,AIR)