你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 编程语言
用Delphi开发Authorware UCD的方法
 

Authorware是一个强大的多媒体著作平台。UCDAuthorware的用户接口,它有16位和32位之分。16位UCD的扩展名是UCD,而32位UCD的扩展名是U32。通俗地讲,UCD就是用户可以通过其他语言来实现一些特殊的功能,然后按照Authorware的要求变成Authorware的函数,把这些函数放在一个具有Windows动态链接库性质的文件中由Authorware调用,这个文件就叫UCD

可见,一旦使用Authorware的人员掌握了UCD的开发与使用方法,Authorware就会借助其它语言的能力,使其功能无限扩展。那么如何来开发UCD呢?下面就语言接口规范等问题探讨如下:

一、引言

从某些高级语言(如VBVC等)的角度来看,UCD就是一种动态链接库。原则上讲,只要能够通过一种语言生成动态链接库,然后按照Authorware的规定将动态链接库变成UCD就可以被Authorware方便地调用了。

二、UCD的接口规范

AuthorwareUCD是属于WindowsAuthorware之间的中间件。要使三者之间顺畅地交流,就必须要遵循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.

我们看到,代码文件大体上分为三个部分:Unitinterfaceimplementation

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为名存盘。

资源文件中由两大部分组成:第一大部分由数字引导及其后的第一对“Beging”“End”;第二大部分是若干组“Begin”“End”

第一大部分是对UCD中所包含功能的总体说明。每一个功能对应一行,这一行由功能名称和“\0”组成,最后一行是单独的“\0”

在第二大部分中,每一组“Begin”“End”之间都由六行组成。第一行是固定的“\0”;第二行是返回参数类型符号加“\0”。类型符号由SIV等字符组成。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的开发并不是高不可攀,只要掌握其要点,再配合一些高级语言(如:DelphiVCBCVB等)就可以取各语言之长,补Authorware之短,来全面发挥这个多媒体著作工具的功能。

本文例子在Win95Delphi5Authorware5 环境下调试通过。

 

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089