Authorware是一个强大的多媒体著作平台。UCD是Authorware的用户接口,它有16位和32位之分。16位UCD的扩展名是UCD,而32位UCD的扩展名是U32。通俗地讲,UCD就是用户可以通过其他语言来实现一些特殊的功能,然后按照Authorware的要求变成Authorware的函数,把这些函数放在一个具有Windows动态链接库性质的文件中由Authorware调用,这个文件就叫UCD。
可见,一旦使用Authorware的人员掌握了UCD的开发与使用方法,Authorware就会借助其它语言的能力,使其功能无限扩展。那么如何来开发UCD呢?下面就语言接口规范等问题探讨如下:
一、引言
从某些高级语言(如VB、VC等)的角度来看,UCD就是一种动态链接库。原则上讲,只要能够通过一种语言生成动态链接库,然后按照Authorware的规定将动态链接库变成UCD就可以被Authorware方便地调用了。
二、UCD的接口规范
Authorware的UCD是属于Windows和Authorware之间的中间件。要使三者之间顺畅地交流,就必须要遵循UCD的规范来设计。具体地讲,设计UCD有两个方面应当严格地遵循。第一是数据类型;第二是函数说明。有关函数说明的方法在实例中将详细解释。现就数据类型作一说明。凡使用过Authorware编程的人员都知道Authorware对数据类型的要求并不是很严格。它与Windows和某些高级语言当中所使用的数据类型并不是一一对应,这就要求我们在使用和开发UCD时应给予重视。数据类型的对照见“参数类型对照表”。
三、Delphi设计实例
下面用Delphi5.0来创建具有两个功能的UCD。一个功能是实现两个数的相加,另一个功能是把一个字符串转换为大写。通过这个实例读者可以掌握用Delphi开发UCD的方法。
1、创建工程
由于UCD有32位和16位之分,因此在创建工程文件时应指明所生成的DLL是32位的还是16位的。不过16位的UCD已经落伍,不加特指通常为32位的UCD。
首先,启动Delphi并在File菜单下创建一个新的工程(project)。这个工程文件的名称定为UCDDEMO ,其扩展名为DPJ。在工程文件窗口内输入如下代码:
library ucddemo;
uses Unit1 in 'Unit1.pas';
exports Add;
exports UCase;
{$ifdef WIN32}
{$R apw32.res}
{$else}
{$R apw16.res}
{$endif}
begin
end.
在创建工程文件时应注意以下几点:
⑴第一行代码中的“Library”是绝对必须的,某种程度上讲它就是DLL的标识。通常情况下第一行的代码是“Program”,但是要生成动态联接库(DLL)此处就必须改为“Library”。
⑵在“uses”段中有一些类是无用的(根据你所开发的DLL的应用而定)。无用的类一定要删去,这样可以减小最终生成UCD文件的长度。如在本例中只有一句“unit1 in "unit1.pas"”。
⑶“exports”说明的是在当前的UCD中所包含的功能名称。本例中包含两个功能“ADD”和“UCase”。
⑷由“{}”括起的部分是条件编译语句。它告诉Delphi当系统是32位时,使用APW32.res文件(此文件由资源文件编译生成,后面讲解),否则使用apw16.res文件。
⑸通常情况下,在“Begin”与“End”之间有一些诸如“Application.Run”之类的语句,而在生成DLL文件时此处为空。
把这个文件保存好。一般说来,编译生成的DLL文件与工程文件同名。
2、实现UCD中的功能
在本例中,为了说明问题仅实现两个功能:两数相加和字符串转大写。
实现这些功能的代码都放在unit1单元中。所以,我们首先要打开unit1文件(通过选择View/units)输入如下代码:
unit Unit1;
interface
uses sysutils, wintypes, winprocs;
function Add( n1, n2 : Integer ) : Integer ; export; {$ifdef WIN32} stdcall ; {$endif}
function ReturnString(StringIn: Pchar): Pchar ; far;
function UCase( StringIn : Pchar ) : Pchar; export; {$ifdef WIN32} stdcall ; {$endif}
implementation
function Add( n1, n2 : Integer ) : Integer ;
begin
Result := n1 + n2;
end;
function UCase( StringIn : Pchar ) : Pchar;
{ NOTE: 没有对字符串的长度进行错误检查. }
var
retstr : array[0..64] of char; { 返回到Authorware的串}
instr, outstr : string[64]; { 一些中间结果串 }
begin
instr := Strpas( StringIn ); {把一个 C 类型的串转换到 pascal 类型的串}
outstr := UpperCase( instr ); { 这里使用了Delphi的内建功能}
strplcopy( retstr , outstr , 60 ); { 把一个 pascal 类型的串转换到 C 类型}
Result := ReturnString( retstr ); {把转换的结果送到Authorware}
end;
function ReturnString(StringIn: Pchar): Pchar ;
{ 把一个串放到Windows的堆栈中,把Windows的句柄放到这个串}
var
hGlobalMemory: THandle;
lpGlobalMemory: pointer ;
begin
{从Windows的堆栈中设置一个字符串指针 }
hGlobalMemory := GlobalAlloc(GMEM_MOVEABLE , strlen(StringIn)+1);
if hGlobalMemory <> 0 then { 内存分配正常 }
begin
{ 在堆栈当中已经占用的内存放置该串 }
lpGlobalMemory := GlobalLock(hGlobalMemory);
lstrcpy(lpGlobalMemory,StringIn);
GlobalUnlock(hGlobalMemory);
end;
{ 把这个串的指针返回到Authorware }
ReturnString := Pchar(hGlobalMemory);
end;
end.
我们看到,代码文件大体上分为三个部分:Unit、interface和implementation。
Unit说明此段代码的名称。
interface为接口段,它说明这段代码里要包含的功能数目和名称。每个功能由function引导说明。凡在unit1.pas文件中使用的功能均需在这一段说明。还应注意的是“{}”间的内容,其目的是指示编译器做32位编译。
Implementation执行段具体将各功能展开实现。这里涉及较多的是用Delphi编程经验与技巧。
在代码文件中应注意以下几点:
⑴由于UCD实质上是DLL类型的文件,所以在编写时要注意内存的管理。尤其是字符串做参数传递时应特别重视。
⑵在与Authorware做参数传递时要注意数据类型的转换。本例中的ReturnString功能值得读者借鉴和引用。
3、创建资源文件
通过资源文件,能够明确地指示出UCD中各个功能的用法,为此我们需要创建一个扩展名为rc的资源文件并通过编译生成一个扩展名为res的文件(此文件在工程文件中指明)。
资源文件为纯文本文件,可以通过任意文件编辑器创建。这里我们不妨打开记事本将如下的内容输入其中。
1 DLL_HEADER PRELOAD DISCARDABLE
BEGIN
"Add\0",
"UCase\0",
"\0"
END
Add DLL_HEADER PRELOAD DISCARDABLE
BEGIN
"\0",
"I\0",
"II\0",
"Result := Add( Num1, Num2 )\r\n",
"\r\n",
"把两个数字相加.\0",
END
UCase DLL_HEADER PRELOAD DISCARDABLE
BEGIN
"\0",
"S\0",
"Result := UCase( str )\r\n",
"\r\n",
"把一个字符串变成大写.\0",
END
将以上代码以APW.RC为名存盘。
资源文件中由两大部分组成:第一大部分由数字“1”引导及其后的第一对“Beging”和“End”;第二大部分是若干组“Begin”和“End”。
第一大部分是对UCD中所包含功能的总体说明。每一个功能对应一行,这一行由功能名称和“\0”组成,最后一行是单独的“\0”。
在第二大部分中,每一组“Begin”和“End”之间都由六行组成。第一行是固定的“\0”;第二行是返回参数类型符号加“\0”。类型符号由S、I、V等字符组成。S代表字符串,I代表整数,V代表无参数,详细描述请参考本文第二大问题或Authorware手册;第三行是输入的参数类型符号和“\0”;第四行是该功能调用的形式加“\0”;第五行是独立的“\r\n”;第六行是该功能使用方法的详细文字说明,最后以“\0”结束。必须严格按照上述形式来构造资源文件。
4、编译资源文件
把资源文件与工程文件存储在同一个目录中,然后编译这个资源文件。找到Delphi所在的目录,然后使用BRC32.EXE编译。输入如下命令:c:\Delphi5\BIN\BRC32 -r apw.rc -foapw32.res。
请注意,此命令一定要在Windows下的Dos窗口中执行,而后便会生成一个名为apw32.res的文件。
5、编译工程文件,创建UCD
对工程文件编译,你会发现在同一目录下生成了一个UCDDEMO.DLL的动态链接库。这就是我们需要的UCD文件。将这个文件的扩展名改为U32便可以在Authorware中使用了。
四、结束语
通过上面的讨论,我们看到,UCD的开发并不是高不可攀,只要掌握其要点,再配合一些高级语言(如:Delphi、VC、BC、VB等)就可以取各语言之长,补Authorware之短,来全面发挥这个多媒体著作工具的功能。
本文例子在Win95、Delphi5、Authorware5 环境下调试通过。
|