日期:2014-05-16 浏览次数:20460 次
《【windows8开发】深入浅出C++/CX》
希望大家带着如下问题去阅读这篇文章。Metro App中,要支持多语言调用,必须封装成windows runtime的组件dll,所谓windows runtime组件就是要基于windows runtime定义好的形式去封装组件API,而这些定义好的形式其实大部分都属于C++ /CX的特性,换句话说就是用C++ /CX的一些C++扩展特性来封装windows runtime组件。
namespace RuntimeC
{
    public ref class Test sealed
    {
    public:
       Test() {}
    };
}
js中的调用:
var nativeObject = new RuntimeC.Test();
很简单吧,通过new和命名空间名,直接访问类来实例化对象。组件中要提供可被javascript实例化的类则必须把该类定义为public ref(不理解public ref的请参考C++ /CX一文)
void Func1() {}那么js中应该如下来调用:nativeObject.func1();
3. 不同语言间的数据交互
大家都知道C++是强类型语言,那么C++传递数据给javascript时,对数据类型有什么要求呢?windows runtime中提供了一些内置类型来供多语言交互时使用,也就是说如果要封装给不同语言调用的接口,就要使用这些内置类型。double Func2(double pa) {
     return pa;
}b. 返回结构体或类对象(C++ --> javascript)public value struct DataStruct {
     int value;
};
public ref class Test sealed
{
public:
     Test() {
     }
     DataStruct Func3() {
          DataStruct data;
          return data;
     }
};注意,这里把DataStruct声明为public value,否则会出错,见C++ /CX。var data = nativeObject.func3();c. 函数参数类型为结构体或类 (javascript --> C++)
public ref struct DataRef sealed {
private:
     int value;
public:
     DataRef() {}
     property int val {
          int get() {return value;}
          void set(int v) {value = v;}
     }
};
public ref class Test sealed
{
public:
     Test() {
     }
     void Func4(DataRef^ data) {
          data->val = 0;
     }
};