用DELPHI開發AUTHORWARE的u32
函數功能是AUTHORWARE最突出的特徵,利用AUTHORWARE提供的系統函數能夠完成一些複雜的控制任務。對於一些特殊的任務,AUTHORWARE允許用戶自己定義函數,使得程序設計具有更大的靈活性。對於windows系統來說,自定義函數是以動態鏈接庫(DLL)文件存儲的,因此存儲自定義函數的文件與當前交互式應用程序文件是分立。本文介紹一下如何用DELPHI開發AUTHORWARE的自定義函數—32bitU32,本文以DELPHI開發可在AUTHORWARE中調用顯示messagebox的U32為例子。雖然AUTHORWAREATTAIN5.0已提供了使用knowledgeobjects顯示messagebox的功能,但在4.0以前的版本無此功能,這就可用其它語言開發自己的U32,在AUTHORWARE中調用。
開發U32可分為五個步驟:
創建工程文件
創建函數
創建資源文件
編譯資源文件
創建u32
1.創建工程文件
在file/new選擇dll生成一個dll文件,在file/addtoPRoject….加入一個包含U32函數代碼的單元myunit.pas(此單元在第二步創建函數中詳細說明)在uses後必須聲明所有可在authorware中調用的函數。例如:
exportsMsgBox;
最終的代碼如下所似:
libraryauthorware;
uses
SysUtils,Classes,
myunitin'myunit.pas';
exportsMsgBox;
begin
end.
2.創建函數
當你創建一個函數可用在authorware中,必須聲明為exported函數在關鍵字interface後面加入代碼如下:
interface
uses,Dialogs,SysUtils,windows;
functionMsgBox(msg:string;mbType:
Word;title:string):WORD;export;
Delphi32需要添加{$ifdefWIN32}stdcall;
($endif}在函數聲明後面如:
functionMsgBox(msg:string;mbType:
Word;title:string):WORD;export;
{$ifdefWIN32}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;
functionStrToPch(Str:string):PChar;
vara:PChar;
begin
a:=StrAlloc(Length(Str)+1);
StrPCopy(a,Str);
StrToPch:=a;
end;
functionMsgBox(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的資源文件。加入如下定義:我將在後面解釋這些定義:
1DLL_HEADERPRELOADDISCARDABLE
BEGIN
"MsgBox/0",
"/0"
END
msgboxDLL_HEADERPRELOADDISCARDABLE
BEGIN
"/0",
"W/0",
"SWS/0",
"Result:=MsgBox(msg,mbType,title)/r/n",
"/r/n",
"showmessagebox/0",
END
如果一個dll文件是按authorware調用轉換格式編寫,則存儲於其中的所有自定義函數的目錄也包含在該文件中,並且authorware在調用這些函數時所需的信息也包含在內,其目錄稱為目錄源,而且目錄源中的每一個函數有相應的定義,這些定義稱為定義源。具體格式如下:
1.目錄源
目錄源的格式如下所示:
|DLL_HEADERPRELOADDISCARDABLE
BEGIN
“functionname[=exportname]/0”,
“functionname[=exportname]/0”,
….
“functionname[=exportname]/0”,
“/0”
END
①|是目錄源標識符;
②DLL_HEADER是用於創建描述性文字的起始標記;
③BEGIN表示該目錄源文件的開始,
而END則表示該目錄源的結尾。
2.自定義函數的定義格式
對於目錄源中每一函數都要有一個相應的定義格式,具體格式如下所示:
functionnameDLL_HEADERPRELOADDISCARDABLE
BEGIN
“dllfilename/0”
“returnvalue/0”
“argumentlist/0”
“description>”,
“description”,
…
“description/0”
END
①functionname指的是在目錄源中以定義的函數名;
②DLLfilename表示存儲函數的dll文件名;
③Returnvalue表示該函數返回值類型;
④Argumentlist表示該函數中的參數類型列表;
⑤Description表示該函數描述性正文。
描述性正文可以有很多行組成,但最後一行必須加上“/0”結束符。
3.參數類型描述格式
參數類型用一個大寫字母表示,每一個字母表示一個參數格式,如下表所示:
描述格式類型描述格式類型
CSignedcharPFarpointer
BUnsignedcharFFloat
ISignedshortintegerDDouble
WUnsignedshortintegerSHandle
LSignedlongintegerVVoid
UUnsignedlonginteger
4.編譯資源文件
把.rc的資源文件保存為a3w.rc(注意不能保存文件名與dll文件名相同否則delphi自己的資源文件會覆蓋它),delphi自帶的編譯文件為brc32.exe,在dos模式下運行:
c:/delphi32/bin/brc32-ra3w.rc–foa3w32.res
現在把資源文件加入工程中,返回delphi在view/projcetsource打開工程文件在
exportsMsgBox;後可看到:
{$R*.RES}
刪除該行加入:{$ifdefWIN32}
{$Ra3w32.res}
{$else}
{$Ra3w16.res}
{$endif}
編譯工程文件.
5.創建u32
我們已經創建了32bit的authorware.dll,把它改名成authorware.u32.現在已成功創建了U32.在authorware中調用authorware.u32在運算設計按鈕添加代碼:
MsgBox("警告框",1+32+0+4096,"是否退出本系統?")