NetBIOS网络协议对于很多读者来说可能比较陌生,但其实它是由IBM开发的一个很古老的协议,当年在LAN上也风光一时......
作者:余六 来源:天极论坛 2007年11月1日
关键字:
/////////Netbios单元///////////
unit netbios;
interface
uses windows,messages,Forms,SysUtils;
type
{$X+}{$A+}
file://声明一个NCB记录指针。
PNCB=^NCB;
file://声明一个后处理例程的过程类型。
POST=procedure(var ncbR:PNCB);
file://以下是NCB记录,教训1:将上面的编译选项置为{$A+}以取消数据对齐。如果在广播中有浮点数的话,数据对齐会让你大吃苦头!我已经有过惨痛教训!:(
NCB=record
ncb_command:UCHAR;
ncb_retcode:UCHAR;
ncb_lsn:UCHAR;
ncb_num:UCHAR;
ncb_buffer:PCHAR;
ncb_length:WORD;
ncb_callname:array [1..16] of UCHAR;
ncb_name:array [1..16] of UCHAR;
ncb_rto:UCHAR;
ncb_sto:UCHAR;
ncb_post:POST;
ncb_lana_num:UCHAR;
ncb_cmd_cplt:UCHAR;
ncb_reserve:array [1..10] of UCHAR;
ncb_event:HANDLE;
end;
file://声明自己的Netbios函数。教训2:一定要使用pascal调用规范,否则,嘿嘿!!
function NetbiosSR(ncbX:PNCB):UCHAR;pascal;
file://初始化NCB。
procedure InitNCB(var ncbY:PNCB);
file://后处理例程,注意使用远指针。
procedure postrout(var ncbR:PNCB);stdcall;far;
var
char_buffer:array[0..511]of UCHAR;
int_buffer:array[1..512]of Byte;
implementation
file://调用系统的Netbios。dll中的Netbios函数标号是6。Delphi搜索外部文件的顺序是当前目录→系统目录→其他目录,别忘了保证存在Netbios.dll。
function NetbiosSR(ncbX:PNCB):UCHAR;external
‘netbios'' index 6;
procedure InitNCB(var ncbY:PNCB);
var
x:integer;
begin
ncbY.ncb_command:=0;
ncbY.ncb_retcode:=0;
ncbY.ncb_lsn:=0;
ncbY.ncb_num:=0;
ncbY.ncb_length:=512; file://数据缓冲长度,最大512B。
for x:=1 to 16 do
begin
ncbY.ncb_callname[x]:=0;
ncbY.ncb_name[x]:=0;
end;
ncbY.ncb_rto:=0;
ncbY.ncb_sto:=0;
ncbY.ncb_lana_num:=0;
ncbY.ncb_cmd_cplt:=0;
for x:=1 to 10 do
ncbY.ncb_reserve[x]:=0;
ncbY.ncb_event:=0;
end;
file://后处理例程的作用是当接收到广播消息时,立即向相应窗口发送消息。我在这里偷了点懒,以广播方式发送一个定时器消息。如果你愿意可以向指定窗口发送自定义消息,这样要复杂一些。
首先,要把指定窗口的句柄传递给后台处理例程。通常这是做不到的,但可以利用一些技巧做到。在NCB记录后面紧挨着声明一个句柄类型,然后把指定窗口的句柄赋值给它的实例变量;这样句柄变量的地址与NCB是连续的。在后处理中通过指针或汇编语句将ncbR的地址移到最后一个字节+1,就是窗口句柄的起始地址。明白吗?至于自定义消息,需要重新编译连接库,限于篇幅我就不罗嗦了,有兴趣的可以自己尝试。