aardio 文档

aardio 范例: C++

//C++
import process.gcc;

//创建 GCC 环境,参数指定 C/C++ 源码目录
var gcc = process.gcc("/");
//C++语法速览 https://quickref.me/zh-CN/docs/cpp.html

//自动存为 main.cpp
gcc["main.cpp"] = /*************
#include <windows.h> 

struct TestInfo{
    int x;
    int y;
    BYTE name[256];
};

class CTestObject
{
public: 
    //注意函数声明前加上 virtual 以支持 aardio 中的 raw.interface
    virtual void getName(char *buffer,int len); 
    virtual void getInfo(TestInfo *pInfo);
};

void CTestObject::getName(char *buffer,int len){
    strcpy(buffer,"测试");
}

void CTestObject::getInfo(TestInfo *pInfo){
    pInfo->x = 1;
    pInfo->y = 2;
    strcpy((char *)pInfo->name,"测试");
}

extern "C" __declspec(dllexport) CTestObject* __cdecl CreateTestObject() { 
    return new CTestObject();
}

extern "C" __declspec(dllexport) void __cdecl DeleteTestObject( CTestObject* pTest) {
    delete pTest;
}

BOOL WINAPI DllMain(HINSTANCE inst,DWORD reason,LPVOID reserved ) 
{
    switch( reason ) 
    { 
        case DLL_PROCESS_ATTACH:
            break;

        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
*************/

//生成 DLL。参数:-shared 生成 DLL,-s 移除调试符号减小体积, -municode 启用 Unicode
gcc.exec("main.cpp -o cpp.dll -shared -s -municode -m32 -O2 -static -lgcc -lstdc++");

//也可以调用 gcc.exe 同目录的其他 exe,g++,make 可以省略 .exe 后缀。
//gcc.exec("g++ main.cpp -o cpp.dll -shared -s -municode -m32 -O2 -static -lgcc -lstdc++");

var dll = raw.loadDll("/cpp.dll",,"cdecl");

import raw.interface;
class testObject{
    ctor(){
        //创建 C++ 对象,并获取指针,注意这里使用了 P 尾标获取指针。
        var pTest = dll.CreateTestObjectP();

        //C++ 对象指针转换为 aardio 对象。
        this = ..raw.interface( pTest,"
            void getName(string &buffer,int len);
            void getInfo(struct &pInfo); 
            ","thiscall" //注意调用约定为thiscall
        )

        //添加析构函数    
        ..table.gc(this,"delete")   
    };
    delete = function(){
        if(!owner.deleted){
            dll.DeleteTestObject( owner );
            owner.deleted = true;
        } 
    };
}

//创建对象
var obj = testObject();

//调用 C++ 函数
var name = obj.getName(25,25);
console.log(name);

//调用 C++ 函数
var info = obj.getInfo({ int x;int y;BYTE name[256]})
console.log( info.name  );

console.pause();

Markdown 格式