aardio官方社区

标题: 含有输出参数的API 该怎么不声明直接调用 [打印本页]

作者: codex    时间: 2017-10-14 22:23
标题: 含有输出参数的API 该怎么不声明直接调用
  1. import console;

  2. GetLocaleInfo = ::Kernel32.api("GetLocaleInfoA","int(int Locale,int LCType,string& lpLCData,int cchData)")

  3. var lcid = ::Kernel32.GetSystemDefaultLCID();
  4. console.log( GetLocaleInfo( lcid, 0x2/*_LOCALE_SLANGUAGE*/ , 1024, 1024 ) )
  5. //下面这样不声明直接调用 返回的值不全
  6. console.log( ::Kernel32.GetLocaleInfoA( lcid, 0x2/*_LOCALE_SLANGUAGE*/ , raw.buffer(1024), 1024 ) )
  7. console.pause(true);
复制代码

作者: Jacen.He    时间: 2017-10-14 22:37
raw.buffer(1024); 你是直接分配了内存指针,
内存地址本身他并不是一个输出参数,所以不会增加一个返回值。

你这样写就可以:
import console;

var lcData = raw.buffer(1024);
::Kernel32.GetLocaleInfoA(lcid, 0x2
/*_LOCALE_SLANGUAGE*/
,lcData,#lcData);

console.log( lcData );
console.pause(
true);



作者: Jacen.He    时间: 2017-10-14 22:41
lcData 是缓冲区指针,是一块可写的内存,你只是把内存地址传给API,不要理解为输出参数。

声明API时 string &就是指定输出参数,这时候返回的字符串内存地址是不一样的。
作者: Jacen.He    时间: 2017-10-14 22:45
调用Unicode版本的API也可以这样写:
import console;

var lcData = {WORD value[1024]};
::Kernel32.GetLocaleInfoW(lcid, 0x2
/*_LOCALE_SLANGUAGE*/
,lcData,1024);

console.log( lcData.value );
console.pause(
true);
结构体,buffer都可以用来接收输出的数据,本质上都是指针。


作者: Jacen.He    时间: 2017-10-14 22:48
因为结构体才是输出参数,会增加返回值,
所以你可以这样写:

import console;

var r,lcData = ::Kernel32.GetLocaleInfo(lcid, 0x2/*_LOCALE_SLANGUAGE*/,{WORD value[1024]},1024);
console.log( lcData.value );

console.pause(
true);

又因为aardio默认会自动切换到Unicode API,所以可以直接写 GetLocaleInfo 而不是 GetLocaleInfoW

作者: codex    时间: 2017-10-15 10:24
Jacen.He 发表于 2017-10-14 22:37
raw.buffer(1024); 你是直接分配了内存指针,
内存地址本身他并不是一个输出参数,所以不会增加一个返回值 ...

嗯 明白啦
不能直接告诉API函数页码,而应该拿个本子告诉他写在第几页 然后再去读出来

import gdi;

var white = gdi.RGB(255,255,255);//白色
var green = gdi.RGB(204,232,207);//绿色

//获取当前窗口背景色
var c = ::User32.GetSysColor(0x5/*_COLOR_WINDOW*/);

aiElements = { int buffer[]={0x5
/*_COLOR_WINDOW*/ } }

aColors ={ int buffer[] }
if(c = white) aColors.buffer = { green }
else aColors.buffer = { white }

::User32.SetSysColors(1, aiElements, aColors)

//SetSysColors = ::User32.api( "SetSysColors", "int(int cElements,int& lpaElement,int& lpaRgbValues)");






欢迎光临 aardio官方社区 (http://bbs.aardio.com/) Powered by Discuz! X3.4