aardio - 向API函数传址取文本的方法探讨

关于Aardio中调用API时,变量传址的方法,一般用 struct 类型可以了,用起来很简单。

 

但是对于文本型,方法可能很多。

本文重点探讨一下传递各种类型变量给API函数,并取回文本型数据的方法。

下面就以 GetWindowText 为例,演示各种取API中文本数据的方法:

import console; 
import win
 
var gwt,t,r
 
//===========================================================
 
console.log('\n先声明,再调用:\n')
 
//声明为string类型
gwt = ::User32.api("GetWindowTextA","int(addr,string,int)")
 
		// 用string类型变量
		t = string.repeat(255,'\x0')
		r = gwt (..win.getForeground(),t,255)
		t = raw.tostring(raw.toPointer(t))
		console.log('1、声明为 string,传递 string,变量值:'+t,r+"个字符")
		
		// 用buffer类型变量
		t = raw.buffer(255)
		r = gwt (..win.getForeground(),t,255)
		t = raw.tostring(raw.toPointer(t))
		console.log('2、声明为 string,传递 buffer,变量值:'+ t,r+"个字符")
 
//声明为string&类型
gwt = ::User32.api("GetWindowTextA","int(addr,string&,int)")
 
		// 用string类型变量
		r,t = gwt (..win.getForeground(),string.repeat(255,'\x0'),255)
		t = raw.tostring(raw.toPointer(t))
		console.log('3、声明为 string&,传递 string,返回值:'+t,r+"个字符")
		
		r,t = gwt (..win.getForeground(),raw.buffer(255),255)
		t = raw.tostring(raw.toPointer(t))
		console.log('4、声明为 string&,传递 buffer,返回值:'+t,r+"个字符")
		
//声明为pointer类型
gwt = ::User32.api("GetWindowTextA","int(addr,pointer,int)")
 
		// 用string类型变量
		t = string.repeat(255,'\x0')
		r = gwt (..win.getForeground(),t,255)
		t = raw.tostring(raw.toPointer(t))
		console.log('5、声明为 pointer,传递 string,变量值:'+ t,r+"个字符")
		
		// 用buffer类型变量
		t = raw.buffer(255)
		r = gwt (..win.getForeground(),t,255)
		t = raw.tostring(raw.toPointer(t))
		console.log('6、声明为 pointer,传递 buffer,变量值:'+ t,r+"个字符")
		
		
//声明为struct&类型
gwt = ::User32.api("GetWindowTextA","int(addr,struct&,int)")
 
		// 用struct类型变量
		t = {byte t[255]}
		r = gwt (..win.getForeground(),t,255)
		t = raw.tostring(raw.toPointer(t.t))
		console.log('7、声明为 struct&,传递 struct,变量值:'+ t,r+"个字符")
		
		// 用struct类型变量
		r,t = gwt (..win.getForeground(),{byte t[255]},255)
		t = raw.tostring(raw.toPointer(t.t))
		console.log('8、声明为 struct&,传递 struct,变量值:'+ t,r+"个字符")
 
//===========================================================
 
console.log('\n不声明,直接调用:\n')
 
//直接传递string类型
	t = string.repeat(255,'\x0')
	r = User32.GetWindowTextA(..win.getForeground(),t,255)
	t = raw.tostring(raw.toPointer(t))
	console.log('1、直接传递 string,变量值:'+ t,r+"个字符")
 
//直接传递buffer类型
	t = raw.buffer(255)
	r = User32.GetWindowTextA(..win.getForeground(),t,255)
	t = raw.tostring(raw.toPointer(t))
	console.log('2、直接传递 buffer,变量值:'+ t,r+"个字符")
 
//直接传递struct类型
	t = {byte t[255]}
	r = User32.GetWindowTextA(..win.getForeground(),t,255)
	t = raw.tostring(raw.toPointer(t.t))
	console.log('3、直接传递 struct,变量值:'+ t,r+"个字符")
 
//直接传递struct类型
	r,t = User32.GetWindowTextA(..win.getForeground(),{byte t[255]},255)
	t = raw.tostring(raw.toPointer(t.t))
	console.log('4、直接传递 struct,返回值:'+ t,r+"个字符")
 
//===========================================================
console.log('\n')
console.pause(true);

运行结果如下:

============================================================

有其他方法的,欢迎留言告知。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢光庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值