首页  编辑  

用DELPHI开发AUTHORWARE的u32

Tags: /超级猛料/DLL.动态链接库/   Date Created:

用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,"是否退出本系统?")