接下来将要进入Netbios的应用阶段。要想调用Netbios API函数,需要链接系统的NETAPI32.DLL文件。Delphi提供了一个NB30单元Netbios API函数及相关的结构、常量进行了定义。
    首先来看看Netbios API包括哪些内容。实际Netbios API只有一个函数:
 
[] 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 B  
    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错误。