各编程语言 + aardio 相互调用示例
代码简单、复制可用。aardio 快速调用 C,C++,C#,Java,R,V,Python,JavaScript,Node.js,Rust,PHP,Ruby,PowerShell,Fortran,Delphi,Julia,Nim,批处理 …… 演示。
aardio 直接调用系统 API 函数( 支持回调、相互调用 ):
var ret,point = ::User32.GetCursorPos({
int x;
int y;
})
aardio / JavaScript 相互调用( 支持 ES6 ):
import web.script;
var vm = web.script("ES6") //导出 aardio 函数到 JavaScript
vm.external = {
log = function(...){
console.log(...)
}
} vm.script = /*****
function TestFunction(a,b) {
return a + b;
}
*****/ var ret = vm.script.TestFunction(2,3);
在 aardio 中调用 Python( Python 调用 aardio 同样简单,参考 aardio 自带范例),简单得就像在 Python 中使用 Python:
import console;
import py3; //导入 Python 模块。
var itertools = py3.import("itertools") //调用 Python 函数,支持纯 aardio 类型参数
var permutations = itertools.permutations({"a","b","c"}); //调用 Python 内置函数 list
var pyList = py3.list(permutations); //遍历 Python 对象成员
for( item in pyList.each() ){
console.log(item); //像 aardio 对象一样使用 Python 对象
} console.pause();
aardio 直接调用 .Net / C# 组件( 支持相互调用,支持委托这些)
import win.ui;
var winform = win.form(text="DataGridView") import System.Data;
var tab = System.Data.DataTable("DT");
tab.Columns.Add("名称");
tab.Rows.Add({"WangWu"}); import System.Windows.Forms;
var grid = System.Windows.Forms.CreateEmbed("DataGridView",winform);
grid.ColumnHeadersHeightSizeMode = 2;
grid.DataSource = System.Data.DataView(tab); winform.show();
win.loopMessage();
aardio 直接调用 Java ( 也支持相互调用 )
import java;
var jvm = java(); //加载Java类对象
HelloworldApp = jvm.import("aardio.sample.HelloworldApp"); //也可以如下自内存或文件直接加载类,
HelloworldApp = jvm.import("aardio.sample.HelloworldApp",$"\java\aardio\sample\HelloworldApp.class"); //用 Java 类创建 Java 对象
var helloworld = HelloworldApp(); //直接调用 Java 对象的方法
var result = helloworld.test(3);
用 aardio 编译 C 语言代码生成 DLL 执行文件,再调用 DLL 中的 C 函数:
import tcc;
//编译 DLL
tcc.build( "/start.dll" ).code = /***
#include <windows.h>
__declspec(dllexport) int Add( int a,int b )
{
return a + b;
}
***/ //加载 DLL
var dll = raw.loadDll( "/start.dll",,"cdecl" );
//调用 C函数
var result = dll.Add(12,3);
在 aardio 中嵌入并调用批处理:
import console
import process.batch; //批处理 for 遍历并拆分字符串
var bat = process.batch(`
@echo off
for %%i in (abc,def,xyz) do echo %%i
`)
console.log(bat.read(-1)) console.pause()
aardio 调用 Rust 语言解析 TOML:
import console;
import string.toml; var str = string.toml.stringify({abc=123,d={1,2,3}});
console.log( str ); import process.code;
process.code("~\lib\string\toml\.res");
console.pause(true);
在 aardio 里嵌入 PHP,以下短短几句代码,包含了 HTTP 服务器,PHP服务端,嵌入的浏览器组件:
import win.ui;
/*DSG{{*/
var winform = win.form(text="Hello World / PHP_CGI 服务器")
/*}}*/ var code = /*
<html>
<head>
<meta charset="utf-8">
<title>PHP 测试</title>
</head>
<body>
<?php echo '<p>Hello World / PHP_CGI 服务器</p>'; ?>
</body>
</html>
*/
string.save("/test.php",code); import php.simpleHttpServer;
var url = php.simpleHttpServer.startUrl("/test.php"); import web.form;
var wb = web.form(winform);
wb.go(url); winform.show();
win.loopMessage();
aardio 调用 PowerShell,并且在 PowerShell 中调用 aardio。这甚至都不用带上体积较大的
System.Management.Automation.dll,一个轻巧的 EXE 就可以搞定一切,向下兼容到 PowerShell 2.0 :
import dotNet.ps; var pScript = /* # 声明 PowerShell 参数
param($win) # 修改 aardio 对象属性
$win.title = "PowerShell + aardio"; # 调用 aardio 对象函数
$win.msgbox("这是 PowerShell 调用 aardio 打开的对话框。")
*/ import win;
dotNet.ps(pScript,{
win = win; //# 将 aardio 对象作为参数传给 PowerShell
});
aardio 执行 Ruby 语言代码 :
import win.ui;
/*DSG{{*/
var winform = win.form(text="执行Ruby代码")
winform.add(
edit={cls="edit";left=26;top=16;right=737;bottom=435;multiline=1;z=1}
)
/*}}*/ import process.ruby;
var out = process.ruby.exec("puts '测试UTF-8'")
winform.edit.print(out); var out = process.ruby.eval(`[1, 2, { name: "tanaka", age: 19 }]`)
winform.edit.print(out); winform.show();
win.loopMessage();
aardio 调用 Node.js :
import console;
import nodeJs; var js = /****** console.log(process.argv); var startEnviron = require('startEnviron');
console.log(startEnviron.dest); ******/ //自动分析 JS 代码中的 require 语句并安装依赖模块
nodeJs.requireByJs(js); //把对象传给 node.js,在 JS 代码中用 require('startEnviron') 获取。
nodeJs.startEnviron({
src:"传个字符串",dest:{test:"嵌套的对象表,传给node.js都没问题",number:123, arr:{1,2,3} }
}) //执行JS,这里指定的启动参数在 JS 代码中可用 process.argv 获取。
var prcs = nodeJs.exec(js,"--args1=1","--args2=1");
prcs.logResponse(); console.pause(true);
aardio 调用 Fortran ( DLL 源码在 aardio 范例里有 ) :
import console //加载 DLL , DLL 路径前加 $ 实现内存加载 DLL(发布后不需要外部 DLL 文件)
var dll = raw.loadDll($"/fortran.dll",,"cdecl"); //不声明直接调用,结构体默认传址,这不用改什么。
var c = dll.__test_MOD_addbypoint({
int x = 22;
int y = 3;
})
console.log(c); //可以先声明一下,参数类型加上&声明为按引用传址(指针)
var add = dll.api("__test_MOD_add","int(int &a,int &b)")
var c = add(33,2); //Fortran 的数值参数默认都是传址(传指针) //不声明直接调用可以用结构体取代指针
var c = dll.__test_MOD_add({int a=33},{int b=2}); //用 raw.int 创建传址数值也可以
var c = dll.__test_MOD_add(raw.int(33,true),raw.int(2,true)); //参数声明为传值时调用更简单,不声明调用时数值默认为 int 类型
var c = dll.__test_MOD_addbyval(33,2,raw.double(123));
console.log(c); //字符串
var str = "hello"; //只读字符串,改用 raw.buffer 创建可读写字节数组
dll.__test_MOD_hello(str,#str); //注意到字符串长度传过去 console.pause(true);
aardio 调用 C++ :
import vc6;
import console;
console.open(); var vc = vc6( "/" ) //输入C++源码
vc.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;
}
******/ //编译生成DLL
vc.exec(
'cl *.cpp'
,'/W3' /*警告等级*/
,'/MD' /*使用多线程动态运行库*/
,'/O2 /Ot /EHsc' /*代码优化选项*/
,'/D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL"' /*定义常数和宏*/
,'/I"./INCLUDE"'/*指定头文件目录*/
,'kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib' /*导入库*/
,'/link /SUBSYSTEM:WINDOWS /MACHINE:X86' /*后面是链接参数 */
,'/out:test.dll'/*输出文件名*/
,'/dll' /*输出DLL*/
,'/LIBPATH:".\LIB" /LIBPATH:".\LIB2"' /*指定库目录*/
) var dll = raw.loadDll("/test.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();
aardio 调用 FreeBASIC ( DLL 源码在 aardio 范例里有 ) :
//加载DLL,DLL路径前面加上$表示把DLL嵌入到程序中并通过内存加载
var dll = raw.loadDll(
$"\basic.dll",,"cdecl" //注意参数里指定使用 cdecl 调用约定。
); //定义结构体,当然也可以先声明一个 class 来创建实例。
var info = {
int x;
INT y;
} // 然后直接调用 API
var ret = dll.msgboxW(123,456,"测试一下好用不好用",info); //最后打印结构体看一下值
import console;
console.log(ret); console.dumpJson(info);
console.pause();
aardio 调用 Delphi ( DLL 源码在 aardio 范例里有) : import win.ui; //内存加载 DLL
var delphiDll = raw.loadDll($"\Project1.dll");
class win.ui.ctrl.delphiForm{
ctor(parent,tParam){
this.hwnd = delphiDll.CreateForm(parent.hwnd);
};
@..win.ui.ctrl.metaProperty()
}
/*DSG{{*/
var winform = win.form(text="用 Delphi 语言为 aardio 编写控件";right=507;bottom=423;bgcolor=11842740)
winform.add(
custom={cls="delphiForm";text="嵌入 Delphi 控件";left=17;top=28;right=490;bottom=211;db=1;dl=1;dr=1;dt=1;z=1};
edit={cls="edit";text="请先用 Delphi 打开此目录下的 DLL 源码工程编译生成 \Project1.dll";left=16;top=228;right=489;bottom=398;edge=1;multiline=1;z=2}
)
/*}}*/ import web.json;
winform.onTest = function(delphiStructParam){
winform.edit.print("Delphi 调用了aardio 函数,参数如下:");
winform.edit.print(delphiStructParam);
delphiStructParam.x = 90; //可选返回修改后的结构体
return delphiStructParam;
}
winform.edit.text = ""; winform.show();
win.loopMessage();
aardio 调用 R 语言:
import console;
import process.r; //执行 R 代码,支持 aardio 模板语法
process.r.code = /*
write("<?="这是 aardio 代码"?>",file=".data.txt");
*/ //执行 R 代码,支持 aardio 模板语法
var out = process.r.loadcode(`write("<?="这是 aardio 代码"?>",file=".data.txt");`) //执行纯 R 代码,参数 @1 可以指定 R代码或 R 文件。
var out = process.r.exec(`
args=commandArgs(T);
write(args[1],file=".data.txt"); # list 有点像 aardio 中的表(table),可以包含各种数据类型,
a <- list(hello = 1, world = "字符串" ) # <- 相当于 aardio 中的等号, R的等号一般用于分隔键值对
print ( a[["world"]] ); # aardio 里的直接下标也是这么写
print ( a$world ); # 相当于 aardio 里的 a.world
print ( a[1] ); # 这个返回的是键值对 hello = 1,不像 aadio 中 a[1] 与 a.hello 是指向不同的元素。
print ( mode(a[1]) ); # 数据类型还是显示为 list b <- TRUE #布尔值必须全大写
print( b ) # 向量
a = c(10, 20, 30, 40, 50)
print( a[1] ) #起始下标为 1 ,这跟 aardio 一样
print( a[1:4] ) # 取出第 1 项到第 4 项 # 定义函数,与 aardio 语法类似
new.function <- function(a,b,c) {
result <- a * b + c # 类似 aardio 中的 return a * b + c #
print(result) # 指定返回值以后,还能继续执行后面的代码,不像 aardio 函数 return 后面的代码被忽略。
} print( new.function(2,3,1) )
`,"测试一下"); //可以添加不定个数的启动参数
console.log( out );
console.more(,true); console.showLoading(" 正在安装 rjson 包");
process.r.require("rjson","https://mirrors.ustc.edu.cn/CRAN/");//不会重复安装 var out = process.r.exec( `
library("rjson") # 载入 rjson 包 args <- commandArgs(T);
tab <- fromJSON(args[1], simplify=FALSE); #不要用 print ,cat 不会加一堆不必要的东西
cat( toJSON(tab) )
`, {
name1 = "测试一下,传对象给 R 语言";
name2 = "这是一个 aardio 对象"
}) console.dump(out); var rCode = /*
testabc <- function(a,b,c) {
result <- a * b + c # 类似 aardio 中的 return a * b + c #
print(result) # 指定返回值以后,还能继续执行后面的代码,不像 aardio 函数 return 后面的代码被忽略。
}
*/ //启动 R
var r = process.r.startRpc(rCode); //调用 R 函数
var ret = r.testabc(2,3,1) //打印 R 函数返回值
if(ret[["result"]]){
console.log("R 函数返回值",ret[["result"]])
}
console.pause(true);
aardio 调用 Julia :
import console;
import julia; //调用 Julia 函数
var ret = julia.sqrt(2);
console.log(ret); //导入 Julia 模块
julia.using("Base64");
var data = julia.Base64.base64encode("测试一下");
console.log( data ); //转换 Julia 数据类型
var buf = julia.value.build(raw.buffer("abc"));
console.log(julia.typeof(buf)); //执行 Julia 代码并获取返回值
var refs = julia.eval("refs = IdDict("); //查看 Julia 代码错误
console.log(julia.lasterr()); console.pause();
aardio 调用 Nim 语言:
import console; var nimCode = /*
{.pragma: rtl, exportc, dynlib, cdecl.} import md5 # Nim 双引号中的字符串,相当于 aardio 中用单引号包含的转义字符串
# aardio 中双引号包含的字符串,相当于 Nim 中的原始字符串: r"原始字符串"
# Nim 与 aardio 都是 UTF-8 编码,aardio 的文本字符串在 Nim 中的类型为 cstring
# Nim 中 string 可以隐式转换为 cstring, cstring 加上 $ 转为 string 类型
proc build*(str: cstring, num: ptr[cint]): cstring {.rtl.} =
num[] = num[] * 2
result = md5.getMD5($str)
*/
string.save("/test.nim",nimCode ) import process.nim;
process.nim("c --app:lib -d:release -r test.nim") //支持改为 $"/test.dll" 内存加载 DLL,
//但这时候 test.dll 还未生成,所以示例里没有加 $
//用cdecl 调用约定的好处是:导出函数名直接可用,不会被加上修饰名
var test = raw.loadDll("/test.dll",,"cdecl") //nim 与 aardio 的字符串都是 UTF-8 编码,UTF-8 真是到处通行,非常方便省了很多事
var build = test.api("build","str(str,int& num)" ) //一般C语言不能这么直接返回字符串(要考虑谁释放内存)。
//但是 nim 可以投机取巧一下,nim 会自动回收内存,而这时候还来不及回收。
var str,num = build("测试abc",9)
console.log(str,num) //用 aardio 算出 MD5 对比一下,结果一模一样
import crypt;
console.log(crypt.md5("测试abc",false))
console.pause();
aardio 调用 V 语言:
import console;
import process.v; console.open(); //V语言不支持中文路径,所以工程目录路径不要包含任何中文
string.save("/hello.v","
struct Point {
pub mut: //声明下面的字段公开、可变
x int
y int
} [export: 'add'] //一定要用这句指定DLL导出函数名
pub fn add(a int,b int,mut pt &Point) int {
pt.x = a+b
return a+b
}" ) /*
V语言是翻译成C语言然后生成DLL,生成的DLL依赖 VC 运行库,
试了换成调用TCC编译,10KB的DLL增大到 400KB,并且运行崩溃。
*/
process.v.shared("hello.v").waitOne(); //V生成的DLL建议至少在 WIN10 上用,需要VC++2017运行库
import sys.vc14;
sys.vc14.require(); //检测并自动安装 VC++ 运行库 //导入DLL,注意要指定 cdecl 调用约定
var dll = raw.loadDll("/hello.dll",,"cdecl") //调用 V 函数( V是翻译为C语言,所以参考C语言的规则)
var n,pt = dll.add(12,3,{int x=1;int y =2}); //输出结果
console.log(n);
console.dumpJson(pt); console.pause(true);
各编程语言 + aardio 相互调用示例的更多相关文章
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- Android和JavaScript相互调用的方法
转载地址:http://www.jb51.net/article/77206.htm 这篇文章主要介绍了Android和JavaScript相互调用的方法,实例分析了Android的WebView执行 ...
- JAVA和C/C++之间的相互调用。
在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用. Java Native Interface (JNI)标准是java平台的一部分 ...
- uLua学习笔记(三):Unity3D和Lua之间的相互调用
这篇笔记主要集中学习一下uLua和Unity3D之间相互调用的方法,我们导入了uLua之后,现在会弹出一个类似学习屏幕的东西,如下: 先赞一个! Unity3D调用Lua Unity3D调用Lua的方 ...
- .Net 与 Java 的服务接口相互调用
本文介绍.Net 与 Java 相互调用的例子.下面的介绍主要包括三方面:一是通过常用Web服务进行相互调用,二是使用TCP/IP套接字进行相互调用,三是使用Remote实现远程对象相互调用. 首先说 ...
- JAVA与.NET的相互调用——通过Web服务实现相互调用
JAVA与.NET是现今世界竞争激烈的两大开发媒体,两者语言有很多相似的地方.而在很多大型的开发项目里面,往往需要使用两种语言进行集成开发.而很多的开发人员都会偏向于其中一种语言,在使用集成开发的时候 ...
- C++基础学习笔记----第四课(函数的重载、C和C++的相互调用)
本节主要讲了函数重载的主要概念以及使用方法,还有C和C++的相互调用的准则和具体的工程中的使用技巧. 函数重载 1.基本概念 函数重载就是用同一个函数名来定义不同的函数.使用不同的函数参数来搭配同一个 ...
- [转]C# winform与Javascript的相互调用
C# winform与Javascript的相互调用 <html> <head> <meta http-equiv="Content-Language" ...
- [Swift]在Swift项目中创建桥接头文件,Swift文件和Objective-C文件相互调用
创建一个Swift项目[demo],以下内容Swift文件和Objective-C文件相互调用都是在Swift项目中. 一.Swift文件调用Objective-C文件 新建文件夹[SupportFi ...
随机推荐
- vue2,vue指令和选项
vue特点 mvvm框架 响应式(声明式) 组件化(支持自定义组件) 丰富的指令(Dom功能的抽象) 基于选项(template,data,computed,watch,methods) vue文档集 ...
- 浮点数(UVa11809)题解
浮点数(UVa11809)题解 如题 计算机常用阶码-尾数的形式保存浮点数.如下所示,若阶码有6位,尾数有8位,可以表达的最大的浮点数为0.1111111112 * 2 ^ 1111112.注意小数点 ...
- 使用fit-content撑开子元素
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【原创】JS文件替换神器--Chrome ReRes插件
本文仅供学习交流使用,如侵立删! JS文件替换神器--Chrome ReRes插件 ReRes插件安装配置 ReRes项目官方地址:https://github.com/annnhan/ReRes 谷 ...
- [算法1-排序](.NET源码学习)& LINQ & Lambda
[算法1-排序](.NET源码学习)& LINQ & Lambda 说起排序算法,在日常实际开发中我们基本不在意这些事情,有API不用不是没事找事嘛.但必要的基础还是需要了解掌握. 排 ...
- Python怎么打印彩色字符串
print 也许是我们在使用 Python 的时候用的最多的一种操作,但是经常发现很多人可以打印彩色文本,这种操作是怎么得到的呢? 一行代码突出重点内容 现在我们通过一个例子,说明彩色文本怎么打印.先 ...
- Python 中MATLABspline函数的替代函数
调用scipy模块,其中有对应的函数UnivariateSpline.与MATLAB中spline函数不同的是,这个函数返回值是一个插值函数,而非插值结果. import scipy spline = ...
- Spring源码 20 手写模拟源码
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
- @babel/runtime 和 @babel/plugin-transform-runtime 两个的作用是什么
Babel 最基础的功能就是将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中. 最基础的依赖包也就是 ...
- Linux 安装 Tomcat 详细教程
Linux 安装Tomcat详细步骤 1. 前往tomcat官网复制下载链接, tomcat官网地址:https://tomcat.apache.org/ 2. 进入到指定目录,使用 wget 命令下 ...