接下来将要进入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.zzzyk.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错误。