游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2180|回复: 5

上次那种动态调用API的方法的补充说明

[复制链接]

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2007-8-5 14:32:00 | 显示全部楼层 |阅读模式
各个函数的参数作用都是不同的,有些参数就是准备着让你提供一个变量然后给函数修改了后返回的,也就是说。嗯,有些函数要提供地址,有些函数要提供值,到底是传值还是传地址?这就要自己找函数的格式了~~~

得到一个变量的地址嘛,那要VarPtr。
嗯,要说明的是,Long等数时,直接使用VarPtr就OK了,如果是String的话,就装在Byte数组里,然后把这个数组的第一个值VarPtr就可以了,还有,这个String要自己加上Null,也就是ASCII为0的那个东西。

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2007-8-5 14:33:00 | 显示全部楼层

控制台库

附带,我的Afflatus语言编写的控制台库。源码如下。

define int FOREGROUND_BLUE:=&H1;
define int FOREGROUND_GREEN:=&H2;
define int FOREGROUND_RED:=&H4;
define int BACKGROUND_BLUE:=&H10;
define int BACKGROUND_GREEN:=&H20;
define int BACKGROUND_RED:=&H40;
define int BACKGROUND_INTENSITY:=&H80;
define int BACKGROUND_SEARCH:=&H20;
define int FOREGROUND_INTENSITY:=&H8;
define int FOREGROUND_SEARCH:=&H10;
define int STD_INPUT_HANDLE:=-10;
define int STD_OUTPUT_HANDLE:=-11;
define int STD_ERROR_HANDLE:=-12;
define int INVALID_HANDLE_VALUE:=-1;
define int ENABLE_LINE_INPUT:=&H2;
define int ENABLE_ECHO_INPUT:=&H4;
define int ENABLE_MOUSE_INPUT:=&H10;
define int ENABLE_PROCESSED_INPUT:=&H1;
define int ENABLE_WINDOW_INPUT:=&H8;
define int ENABLE_PROCESSED_OUTPUT:=&H1;
define int ENABLE_WRAP_AT_EOL_OUTPUT:=&H2;
int hConsoleOut,hConsoleIn,hConsoleErr;

procedure Console_Initialize;
  callapi("kernel32","AllocConsole",0);
  hConsoleIn:=callapi("kernel32","GetStdHandle",0,int 'STD_INPUT_HANDLE');
  hConsoleOut:=callapi("kernel32","GetStdHandle",0,int 'STD_OUTPUT_HANDLE');
  hConsoleErr:=callapi("kernel32","GetStdHandle",0,int 'STD_ERROR_HANDLE');
endprocedure;

procedure Console_Terminate;
  callapi("kernel32","CloseHandle",0,int 'hConsoleIn');
  callapi("kernel32","CloseHandle",0,int 'hConsoleOut');
  callapi("kernel32","CloseHandle",0,int 'hConsoleErr');
  callapi("kernel32","FreeConsole",0);
endprocedure;

procedure Console_SetTitle(string lpConsoleTitle);
  callapi("kernel32","SetConsoleTitleA",1,string 'lpConsoleTitle');
endprocedure;

procedure Console_SetTextAttribute(int wAttributes);
  callapi("kernel32","SetConsoleTextAttribute",0,int 'hConsoleOut',int 'wAttributes');
endprocedure;

procedure Console_Write(string lpConsoleWriteBuffer);
int nNumberOfCharsToWrite;
int lpNumberOfCharsWritten;
  nNumberOfCharsToWrite:=length('lpConsoleWriteBuffer');
  callapi("kernel32","WriteConsoleA",1,int 'hConsoleOut',^string 'lpConsoleWriteBuffer',int 'nNumberOfCharsToWrite',int 'lpNumberOfCharsWritten',int 0);
endprocedure;

procedure Console_ReadLine(int lpConsoleReadBufferLength);
string lpConsoleReadBuffer;
int lpNumberOfCharsRead;
  lpConsoleReadBuffer:=string('lpConsoleReadBufferLength', "\u");
  callapi("kernel32","ReadConsoleA",1,int 'hConsoleIn',^string 'lpConsoleReadBuffer',int 'lpConsoleReadBufferLength',^int 'lpNumberOfCharsRead',int "\u");
  if('lpNumberOfCharsRead'>0);
    lpConsoleReadBuffer:=left('lpConsoleReadBuffer','lpNumberOfCharsRead');
    return('lpConsoleReadBuffer');
  endif;
endprocedure;

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2007-8-5 14:35:00 | 显示全部楼层

Re:上次那种动态调用API的方法的补充说明

测试这个库的程序。

//This program will test Library Console;
include("libconsole.lib");
procedure main;
string teststr;
int i,j;
int FG_Colors[1..12],BG_Colors[1..12];
  FG_Colors[1]:='FOREGROUND_BLUE';
  FG_Colors[2]:='FOREGROUND_GREEN';
  FG_Colors[3]:='FOREGROUND_RED';
  FG_Colors[4]:='FOREGROUND_BLUE'+'FOREGROUND_GREEN';
  FG_Colors[5]:='FOREGROUND_BLUE'+'FOREGROUND_RED';
  FG_Colors[6]:='FOREGROUND_RED'+'FOREGROUND_GREEN';
  for(i:=1,'i'<=6,i:='i'+1);FG_Colors['i'+6]:='FG_Colors['i']'+'FOREGROUND_INTENSITY';next;
  BG_Colors[1]:='BACKGROUND_BLUE';
  BG_Colors[2]:='BACKGROUND_GREEN';
  BG_Colors[3]:='BACKGROUND_RED';
  BG_Colors[4]:='BACKGROUND_BLUE'+'BACKGROUND_GREEN';
  BG_Colors[5]:='BACKGROUND_BLUE'+'BACKGROUND_RED';
  BG_Colors[6]:='BACKGROUND_RED'+'BACKGROUND_GREEN';
  for(i:=1,'i'<=6,i:='i'+1);BG_Colors['i'+6]:='BG_Colors['i']'+'BACKGROUND_INTENSITY';next;
  call(Console_Initialize);
  call(Console_Write,"Color Test :\n");
  for(i:=1,'i'<=12,i:='i'+1);
    for(j:=1,'j'<=12,j:='j'+1);
      call(Console_SetTextAttribute,'FG_Colors['i']'+'BG_Colors['j']');
      call(Console_Write,"C");
    next;
    call(Console_Write,"\n");
  next;
  call(Console_SetTextAttribute,'FOREGROUND_INTENSITY'+&H7);
  call(Console_Write,"What about change console title");
  teststr:=Console_ReadLine(30);
  call(Console_SetTitle,"Library Console Test Program");
  call(Console_Write,"\n");
  call(Console_Write,"Enter a string please :");
  teststr:=Console_ReadLine(30);
  call(Console_Write,"You entered :"'teststr');
  call(Console_ReadLine,0);
  call(Console_Terminate);
endprocedure;

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2007-8-5 14:37:00 | 显示全部楼层

Re:上次那种动态调用API的方法的补充说明

不知道大家看出来没有,我这个程序调用API时选择传地址的关键字是什么?对了,是"^"。
比如:
callapi("kernel32","ReadConsoleA",1,int 'hConsoleIn',^string 'lpConsoleReadBuffer',int 'lpConsoleReadBufferLength',^int 'lpNumberOfCharsRead',int "\u");

15

主题

2093

帖子

2093

积分

金牌会员

Rank: 6Rank: 6

积分
2093
发表于 2007-8-5 14:51:00 | 显示全部楼层

Re: 上次那种动态调用API的方法的补充说明

Miu.C: 上次那种动态调用API的方法的补充说明

如果是String的话,就装在Byte数组里,然后把这个数组的第一个值VarPtr就可以了,还有,这个String要自己加上Null,也就是ASCII为0的那个东西。


为什么不用StrPtr [em24] [em24]

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
 楼主| 发表于 2007-8-5 14:58:00 | 显示全部楼层

Re:上次那种动态调用API的方法的补充说明

上次那篇文章里说要用Byte数组,我也懒得试验StrPtr了,可能不能用的原因就是和那个Null有关吧??
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 14:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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