接下來將要進入Netbios的編程應用階段。要想調用Netbios API函數,需要鏈接系統的NETAPI32.DLL文件。Delphi提供了一個NB30單元Netbios API函數及相關的結構、常量進行了定義。 首先來看看Netbios API包括哪些內容。實際Netbios API只有一個函數: [delphi] view plaincopy UCHAR Netbios(PNCB: pNCB); 函數中的惟一參數pNCB是一個指向某個網絡控制塊(TNCB)的指針。在那個NCB結構中,包含了為執行一個Netbios命令,相應的Netbios函數需要用到的全部信息。該結構的定義如下: [delphi] view plaincopy type // Network Control Block PNCB = ^TNCB; TNCBPostProc = procedure(P: PNCB); TNCB = packed record ncb_command: Char; // command code ncb_retcode: Char; // return code ncb_lsn: Char; // local session number ncb_num: Char; // number of our network name ncb_buffer: PChar; // address of message buffer ncb_length: Word; // size of message buffer ncb_callname: array[0..NCBNAMSZ - 1] of char; // blank-padded name of remote ncb_name: array[0..NCBNAMSZ - 1] of char; // our blank-padded netname ncb_rto: Char; // rcv timeout/retry count ncb_sto: Char; // send timeout/sys timeout ncb_post: TNCBPostProc; // POST routine address ncb_lana_num: Char; // lana (adapter) number ncb_cmd_cplt: Char; // 0xff => commmand pending ncb_reserve: array[0..9] of Char; // reserved, used by BIOS ncb_event: THandle; // HANDLE to Win32 event which // will be set to the signalled // state when an ASYNCH command // completes end; 雖然TNCB結構比較復雜,但並不是在對Netbios的每次調用中都需要用到該結構內的全部成員。有些數據成員對應的是輸出參數,換言之,自Netbios調用返回之後才會設置這些成員的值。 需要提醒大家的是;進行任何Netbios調用之前,不要一開始就填寫結構內的各個成員,而應先將這個NCB結構清0.TNCB結構中的各個成員的含義如下所示: (I)ncb_command ncb_command成員用來指定要執行的Netbios命令。許多命令都可同步或異步與ASYNCH(OX860)標志以及其他命令進行按位(或)OR運算。 (2)ncb_retcode ncb_retcode成員存儲操作的返回代碼。在一個異步操作進行期間,函數會將該值設為NRC_PENDING。 (3)ncb_lsn ncb_lsn成員對應一個本地會話編號,與當前環境內的會話有著惟一對應的關系。成功執行了一次NCBCALL或NCBLISTEN入命令後,函數會返回一個新的會話編號。 (4)ncb_num ncb_num成員指定本地名字的編號。伴隨NCBADDNAME或NCBADDGRNAME命令的每一次調用,都會返回一個新編號。對所有數據報命令,都必須使用一個有效的編號。 (5)ncb_buffer ncb_buffer成員是一個指針,它指向數據緩沖區,對那些需要發送數據的命令,該緩沖區包含了要送出的實際數據;對於那些需要接收數據的命令,則包含了要從Netbios函數返回的數據,對其他命令來說,如NCBENUM ,緩沖區便是預定義的結構LANA_enum。 (6)ncb_length ncb_length成員指定緩沖區ncb_buffer的長度(以字節數為單位)。對於接收命令來說,Netbios會將該值設為收到的字節數。若指定的緩沖區不夠大,Netbios就會返回NRC_BUFLEN錯誤。 (7)}ncb_callname ncb_callname成員指定遠程應用程序的名字。 (8)ncb_name ncb_name成員指定應用程序已知的名字。 (9)ncb_rto ncb_rto成員設定接收操作的超時期限。該值應設為500毫秒的一個整數倍數。若為0,表示沒有超時限制。該值是為NCBCALL和NCBLISTEN命令設置的,它們會影響後續的NCBRECV命令。 (10)ncb_sto ncb_sto成員設定發送操作的超時期限。該值應設為500毫秒的一個整數倍數。若為l,表示不存在超時限制。該值是為NCBCALL和NCBLIST命令設置的,它們會影響後續的NCBSEND和入CBCHAINSEND命令。 (11)ncb_post www.2cto.com ncb_post成員指定異步命令完成後需要調用的回調例程的地址,函數原型定義如下: TNCBPostProc = procedure(P: PNCB); 其中,P指向已完成命令的網絡控制塊。 (12)ncb_lana_num ncb_lana_num成員指定要在上面執行命令的LANA編號。 (l3)ncb_cmd_cplt ncb_cmd_cplt成員指定操作的返回代碼。異步操作進行期間,Netbios會將這個值設為NRC_PENDING。 ( l4) ncb_reserve ncb_reserve成員目前為保留字段,必須為0。 (15)ncb_event ncb_event成員指定設置為“無信號”(Nonsignaled)狀態的一個Windows事件對象的句柄。完成一個異步命令後,事件便會設置成它的“有信號”(Signaled)狀態。只應人工重設事件。假若脫nb_command未設置ASYNCH標志,或者ncb_post不為0,那麼該字段必須為0.否則,Netbios會返回 NRC_ILLCMD錯誤。