用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",
""
END
msgbox DLL_HEADER PRELOAD DISCARDABLE
BEGIN
"",
"W",
"SWS",
"Result := MsgBox(msg,mbType,title) ",
" ",
"show messagebox",
END
如果一個 dll文件是按authorware調用轉換格式編寫,則存儲於其中的所有自定義函數的目錄也包含在該文件中,並且authorware在調用這些函數時所需的信息也包含在內,其目錄稱為目錄源,而且目錄源中的每一個函數有相應的定義,這些定義稱為定義源。具體格式如下:
1. 目錄源
目錄源的格式如下所示:
| DLL_HEADER PRELOAD DISCARDABLE
BEGIN
“functionname [=exportname]”,
“functionname [=exportname]”,
….
“functionname [=exportname]”,
“”
END
① | 是目錄源標識符;
② DLL_HEADER 是用於創建描述性文字的起始標記;
③ BEGIN 表示該目錄源文件的開始,
而END則表示該目錄源的結尾。
2.自定義函數的定義格式
對於目錄源中每一函數都要有一個相應的定義格式,具體格式如下所示:
functionname DLL_HEADER PRELOAD DISCARDABLE
BEGIN
“dllfilename”
“returnvalue”
“argumentlist”
“description>”,
“description”,
…
“description”
END
① functionname 指的是在目錄源中以定義的函數名;
② DLL filename 表示存儲函數的dll文件名;
③ Returnvalue 表示該函數返回值類型;
④ Argumentlist 表示該函數中的參數類型列表;
⑤ Description 表示該函數描述性正文。
描述性正文可以有很多行組成,但最後一行必須加上“”結束符。
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:Delphi32inrc32 -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,"是否退出本系統?")