# raw.interface 库模块帮助文档

<details>  <summary>展开用法说明</summary>  <p>
原生对象指的是 C++ 这种原生语言实现的对象。
原生接口声明定义了原生对象提供哪些成员函数，以及这些成员函数的原型。

所有可用的原生类型请参考文档：
https://www.aardio.com/zh-cn/docs/library-guide/builtin/raw/datatype.html

原生接口声明一般指的是一个类。
com.interface 命名空间下面的所有类都是 COM 原生接口声明类。 
com.interface 内部调用 raw.interface ，这种接口声明类的格式是兼容的。

以下是 IUnknown 接口声明类：

```aardio
class IUnknown{
    ptr QueryInterface = "int(struct iid,ptr &ptr)" ;
    ptr AddRef = "int()" ;
    ptr Release ="int()" ;
}
```
原生接口声明类必须创建一个结构体，
所有成员的原生类型必须是 ptr，而值必须用一个字符串声明原生函数原型。
原型里使用的原生类型与声明原生 API 使用的类型相同，

关于原生类型：https://www.aardio.com/zh-cn/docs/library-guide/builtin/raw/datatype.html

原生接口声明可以用一个字符串表示，每行声明一个成员函数原型。
参考：[范例 - 使用 thiscall 调用 C++ 对象](https://www.aardio.com/zh-cn/docs/examples/Languages/CPP/thiscall.html?q=raw.interface%28)

示例：

```aardio
this = raw.interface( pTest,"
    void getName(string &buffer,int len);
    void getInfo(struct &pInfo); 
    ","thiscall"  
)
```

用字符串声明接口时 aardio 会将其自动转换为前述的接口声明类。
这种写法只是将函数名直接写在原型里了，并且每行字符串表示一个成员函数。

com.interface 里则不支持用字符串声明接口类的方法，
因为所有 COM 接口类声明都必须定义 IID 静态成员，并且必须继承自 com.interface.IUnknown 。
这就要求 COM 接口声明必须是类（ 但 com.interface 的参数支持用类名称表示 com.interface 下已导入的声明类 ）。
</p></details>

[范例 - 使用 thiscall 调用 C++ 对象](https://www.aardio.com/zh-cn/docs/examples/Languages/CPP/thiscall.html?q=raw.interface%28)

## raw 成员列表 <a id="raw" href="#raw">&#x23;</a>

### raw.interface <a id="raw.interface" href="#raw.interface">&#x23;</a>
原生接口类。  
兼容 C++ 类定义中用 virtual 关键字声明的成员函数。  
兼容 COM 原生接口，com.interface 内部调用 raw.interface 。

如果参数 @1 指定原生接口对象指针或指针地址则导入原生对象接口。  
如果参数 @1 指定纯表（无元表）或省略参数 @1（不用保留参数占位）则实现原生对象接口。

### raw.interface(declInterface,callingConvention) <a id="raw.interface" href="#raw.interface">&#x23;</a>
实现原生接口。  
参数 @declInterface 指定接口声明，这是一个类（class）或字符串。  
可选参数 @2 可指定 "stdcall", "cdecl", "fastcall" 调用约定，默认为 "stdcall"。  
创建对象后，可添加与接口匹配的成员函数。  
未定义成员在被调用时忽略并直接返回 0。

### raw.interface(implPtr,declInterface,callingConvention) <a id="raw.interface" href="#raw.interface">&#x23;</a>

```aardio
raw.interface(/*参数 @implPtr 指定原生接口指针或地址数值。  
参数 @declInterface 指定接口声明，这是一个类（class）或字符串。  
参数 @3 可省略，默认为 "stdcall" 。  
*/,"  
	void getName(string &buffer,int len);  
	bool getInfo(struct &pInfo);   
	","thiscall"  
)
```

### raw.interface(implTable,declInterface,callingConvention) <a id="raw.interface" href="#raw.interface">&#x23;</a>
实现原生接口。  
参数 @1 必须是纯表（不能有元表），并定义与接口匹配的成员函数（被调用时忽略未定义成员）。  
参数 @declInterface 指定接口声明，这是一个类（class）或字符串。  
可选参数 @3 可指定 "stdcall", "cdecl", "fastcall" 调用约定，默认为 "stdcall"。。
