用delphi开发authorware的u32
函数功能是authorware最突出的特征,利用authorware提供的系统函数能够完成一些复杂的控制任务。对于一些特殊的任务,authorware允许用户自己定义函数,使得程序设计具有更大的灵活性。对于windows系统来说,自定义函数是以动态链接库(dll)文件存储的,因此存储自定义函数的文件与当前交互式应用程序文件是分立。本文介绍一下如何用delphi开发authorware的自定义函数—32 bit u32,本文以delphi开发可在authorware中调用显示message box的u32为例子。虽然authorware attain 5.0已提供了使用knowledge objects 显示message box的功能,但在4.0以前的版本无此功能,这就可用其它语言开发自己的u32,在authorware中调用。
开发u32可分为五个步骤:
创建工程文件
创建函数
创建资源文件
编译资源文件
创建u32
1.创建工程文件
在file/new选择dll生成一个dll文件,在file/add to project….加入一个包含u32函数代码的单元myunit.pas(此单元在第二步创建函数中详细说明)在uses后必须声明所有可在authorware中调用的函数。例如:
exports msgbox;
最终的代码如下所似:
library authorware;
uses
sysutils,classes,
myunit in 'myunit.pas';
exports msgbox;
begin
end.
2.创建函数
当你创建一个函数可用在authorware中,必须声明为exported 函数在关键字interface 后面加入代码如下:
interface
uses ,dialogs,sysutils,windows;
function msgbox(msg:string;mbtype:
word;title:string):word;export;
delphi32 需要添加{$ifdef win32} stdcall ;
($endif} 在函数声明后面如:
function msgbox(msg:string;mbtype:
word;title:string):word;export;
{$ifdef win32} stdcall ; {$endif}
现在我们为函数加入代码在implementation后面:
const
okonly=0;
okcancel=1;
abortretryignore=2;
yesnocancel=3;
yesno=4;
retrycancel=5;
critical=16;
question=32;
excalamation=48;
information=64;
defaultbutton1=0;
defaultbutton2=256;
defaultbutton3=512;
applicationmodal=0;
systemmodal=4096;
function strtopch(str:string):pchar;
var a:pchar;
begin
a:=stralloc(length(str)+1);
strpcopy(a,str);
strtopch:=a;
end;
function msgbox(msg:string;mbtype:
word;title:string):word;
var
lptext,lpcaption:pchar;
h:hwnd;
begin
lptext:=strtopch(title);
lpcaption:=strtopch(msg);
h:=getactivewindow();
msgbox:=messagebox(h,lptext,lpcaption,mbtype);
end;
3.创建资源文件
最后我们要做的事情是创建资源文件,这样authorware才能直接调用函数。必须先创建.rc文件然后编译成.res文件。使用记事本创建.rc的资源文件。加入如下定义:我将在后面解释这些定义:
1 dll_header preload discardable
begin
"msgbox\0",
"\0"
end
msgbox dll_header preload discardable
begin
"\0",
"w\0",
"sws\0",
"result := msgbox(msg,mbtype,title)\r\n",
"\r\n",
"show messagebox\0",
end
如果一个 dll文件是按authorware调用转换格式编写,则存储于其中的所有自定义函数的目录也包含在该文件中,并且authorware在调用这些函数时所需的信息也包含在内,其目录称为目录源,而且目录源中的每一个函数有相应的定义,这些定义称为定义源。具体格式如下:
1. 目录源
目录源的格式如下所示:
dll_header preload discardable
begin
“functionname [=exportname]\0”,
“functionname [=exportname]\0”,
….
“functionname [=exportname]\0”,
“\0”
end
① 是目录源标识符;
② dll_header 是用于创建描述性文字的起始标记;
③ begin 表示该目录源文件的开始,
而end则表示该目录源的结尾。
2.自定义函数的定义格式
对于目录源中每一函数都要有一个相应的定义格式,具体格式如下所示:
functionname dll_header preload discardable
begin
“dllfilename\0”
“returnvalue\0”
“argumentlist\0”
“description>”,
“description”,
…
“description\0”
end
① functionname 指的是在目录源中以定义的函数名;
② dll filename 表示存储函数的dll文件名;
③ returnvalue 表示该函数返回值类型;
④ argumentlist 表示该函数中的参数类型列表;
⑤ description 表示该函数描述性正文。
描述性正文可以有很多行组成,但最后一行必须加上“\0”结束符。
3.参数类型描述格式
参数类型用一个大写字母表示,每一个字母表示一个参数格式,如下表所示:
描述格式 类型 描述格式 类型
c signed char p far pointer
b unsigned char f float
i signed short integer d double
w unsignedshort integer s handle
l signed long integer v void
u unsigned long integer
4.编译资源文件
把.rc的资源文件保存为a3w.rc(注意不能保存文件名与dll文件名相同否则delphi自己的资源文件会覆盖它),delphi自带的编译文件为brc32.exe,在dos模式下运行:
c:\delphi32\bin\brc32 -r a3w.rc –foa3w32.res
现在把资源文件加入工程中,返回delphi在view/projcet source打开工程文件在
exports msgbox;后可看到:
{$r *.res}
删除该行加入: {$ifdef win32}
{$r a3w32.res}
{$else}
{$r a3w16.res}
{$endif}
编译工程文件.
5.创建u32
我们已经创建了32bit的authorware.dll,把它改名成authorware.u32.现在已成功创建了u32.在authorware中调用authorware.u32在运算设计按钮添加代码:
msgbox("警告框",1+32+0+4096,"是否退出本系统?")
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器