搜索
aardio官方社区 门户 查看主题

含有输出参数的API 该怎么不声明直接调用

发布者: codex | 发布时间: 2017-10-14 22:23| 查看数: 801| 评论数: 5|帖子模式

  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:36
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:30
lcData 是缓冲区指针,是一块可写的内存,你只是把内存地址传给API,不要理解为输出参数。

声明API时 string &就是指定输出参数,这时候返回的字符串内存地址是不一样的。
Jacen.He 发表于 2017-10-14 22:45:44
调用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:57
因为结构体才是输出参数,会增加返回值,
所以你可以这样写:

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:31
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.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-6-25 06:21 , Processed in 0.062500 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表