home *** CD-ROM | disk | FTP | other *** search
/ Chip 1999 March / Chip_1999-03_cd.bin / zkuste / delphi / INFO / DI9806JP.ZIP / Main.pas < prev    next >
Pascal/Delphi Source File  |  1997-12-05  |  18KB  |  568 lines

  1. unit Main;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows,  SysUtils, Classes, Controls, Forms, Dialogs,
  7.   Winsock2, StdCtrls, Menus, ComCtrls, ExtCtrls, ComObj, WSAErr;
  8.  
  9. // Winsock version 2.2
  10. const
  11.  LoVer = 2;
  12.  HiVer = 2;
  13.  
  14. type
  15.  
  16. //Record to store info from WSAEnumProtocols
  17.  
  18.   PWSProtoRec    = ^TWSProtoRec;
  19.   TWSProtoRec    = record
  20.                     ProtocolNo,
  21.                     ProviderFlags :  Integer;
  22.                     ConnectionLess,
  23.                     MsgOriented,
  24.                     Reliable,
  25.                     StrmOriented,
  26.                     GuaranteedD,
  27.                     GuaranteedO,
  28.                     PsuedoStrm,
  29.                     GracefulClose,
  30.                     Expedited,
  31.                     ConnData,
  32.                     DisConnData,
  33.                     BroadCast,
  34.                     MultiCast,
  35.                     ControlPlaneRoot,
  36.                     DataPlaneRoot,
  37.                     QOS,
  38.                     UniSend,
  39.                     UniRecv,
  40.                     IFSHandles,
  41.                     PartialMsg  : BOOLEAN;
  42.                     ProvID       : TGUID;
  43.                     CatalogID    : DWORD;
  44.                     Version,
  45.                     AddrFamily,
  46.                     MaxSockAddr,
  47.                     MinSockAddr,
  48.                     SocketType,
  49.                     Protocol,
  50.                     ProtocolOffset,
  51.                     NetworkByteOrder,
  52.                     SecurityScheme   : INTEGER;
  53.                     MessageSize      : DWORD;
  54.                     ProtocolName     : String;
  55.                    end;
  56.  
  57.  
  58. // Record to store info from WSAEnumNameSpaceProviders
  59.  
  60.   PWSNSPRec    = ^TWSNSPRec;
  61.   TWSNSPRec    =   record
  62.                     ProviderID : TGUID;
  63.                     NameSpace  : DWORD;
  64.                     Active     : BOOLEAN;
  65.                     Version    : DWORD;
  66.                     Identifier : String;
  67.                    end;
  68.  
  69.   TfrmMain = class(TForm)
  70.     PageControl1: TPageControl;
  71.     TabSheet1: TTabSheet;
  72.     MainMenu1: TMainMenu;
  73.     sbStatusMsg: TStatusBar;
  74.     File1: TMenuItem;
  75.     Help1: TMenuItem;
  76.     About1: TMenuItem;
  77.     Exit1: TMenuItem;
  78.     TabSheet2: TTabSheet;
  79.     btnGetNPs: TButton;
  80.     gbProtocols: TGroupBox;
  81.     GroupBox1: TGroupBox;
  82.     lbProtocols: TListBox;
  83.     gbType: TGroupBox;
  84.     cbConnLess: TCheckBox;
  85.     cbMsgOriented: TCheckBox;
  86.     cbStrmOriented: TCheckBox;
  87.     cbGuaranteedD: TCheckBox;
  88.     cbGuaranteedO: TCheckBox;
  89.     cbPsuedoStrm: TCheckBox;
  90.     cbGracefulClose: TCheckBox;
  91.     cbExpedited: TCheckBox;
  92.     cbConnData: TCheckBox;
  93.     cbDisConnData: TCheckBox;
  94.     cbBroadcast: TCheckBox;
  95.     cbMulticast: TCheckBox;
  96.     cbQOS: TCheckBox;
  97.     cbUniSend: TCheckBox;
  98.     cbUniRecv: TCheckBox;
  99.     cbIFS: TCheckBox;
  100.     cbPartialMsg: TCheckBox;
  101.     gbMultipoint: TGroupBox;
  102.     cbRootCtrlPlane: TCheckBox;
  103.     cbRootDataPlane: TCheckBox;
  104.     gbMiscellaneous: TGroupBox;
  105.     edProtoVersion: TEdit;
  106.     Label1: TLabel;
  107.     edAddrFamily: TEdit;
  108.     Label2: TLabel;
  109.     edSocketType: TEdit;
  110.     Label3: TLabel;
  111.     edProtocol: TEdit;
  112.     Label4: TLabel;
  113.     edNetworkOrder: TEdit;
  114.     edCatalogEID: TEdit;
  115.     Label5: TLabel;
  116.     Label6: TLabel;
  117.     edNoProtocols: TEdit;
  118.     Label7: TLabel;
  119.     gbNameSpaces: TGroupBox;
  120.     lbNameSpaceProviders: TListBox;
  121.     gbMiscNSP: TGroupBox;
  122.     ckbActive: TCheckBox;
  123.     gbVersion: TGroupBox;
  124.     edVersion: TEdit;
  125.     gbIdentifier: TGroupBox;
  126.     edIdentifier: TEdit;
  127.     GroupBox2: TGroupBox;
  128.     edNSPGuid: TEdit;
  129.     gbProtocolGuid: TGroupBox;
  130.     edProtocolGuid: TEdit;
  131.     procedure FormCreate(Sender: TObject);
  132.     procedure Exit1Click(Sender: TObject);
  133.     procedure About1Click(Sender: TObject);
  134.     procedure lbProtocolsClick(Sender: TObject);
  135.     procedure lbNameSpaceProvidersClick(Sender: TObject);
  136.   private
  137.     wsaData : TWSADATA;
  138.     Started : Boolean;
  139.     VerRqd  : WordRec;
  140.     WSProtoInfo  : PWSProtoRec;
  141.     WSProtoList  : TList;
  142.     WSNSInfo     : PWSNSPRec;
  143.     WSNSList     : TList;
  144.     NoProtocols  : Integer;
  145.     WSProtoListFreed,
  146.     WSNSListFreed : Boolean;
  147.     function Start : BOOLEAN;
  148.     function GetAddrFamily(iAddressFamily : Integer) : String;
  149.     function GetSocketType(iSocketType : Integer) : String;    
  150.     function GetProtocolType(iProtocol : Integer) : String;
  151.     function GetNetworkOrder(iNetworkByteOrder : Integer) : String;
  152.     procedure UpdateProtoFields;
  153.     procedure UpdateNSPFields;
  154.     procedure CleanUpLists;
  155.     procedure GetProtocols;
  156.     function  GetNameSpaceProviders(NameSpace : DWORD) : String;
  157.     procedure GetNSProviders;
  158.   end;
  159.  
  160. var
  161.   frmMain: TfrmMain;
  162.  
  163. implementation
  164.  
  165. uses About;
  166.  
  167. {$R *.DFM}
  168.  
  169. // Maximum size of array for WSAEnumProtocols and WSAEnumNameSpaceProviders APIs
  170.  
  171.  const
  172.   ArraySize  = 8192;
  173.  
  174. // This function checks for the correct WINSOCK
  175.  
  176. function TfrmMain.Start : BOOLEAN;
  177. begin
  178.  with VerRqd do
  179.  begin
  180.   Hi := HiVer;
  181.   Lo := LoVer;
  182.  end;
  183.  Result := WSAStartUp(Word(VerRqd),wsaData) = 0;
  184. end; // TfrmMain.Start
  185.  
  186. // Returns a string of address family
  187.  
  188. function TfrmMain.GetAddrFamily(iAddressFamily : Integer) : String;
  189. begin
  190.  case iAddressFamily of
  191.   0 : Result := 'AF_UNSPEC';
  192.   1 : Result := 'AF_UNIX';
  193.   2 : Result := 'AF_INET';
  194.   3 : Result := 'AF_IMPLINK';
  195.   4 : Result := 'AF_PUP';
  196.   5 : Result := 'AF_CHAOS';
  197.   6 : Result := 'AF_IPX or AF_NS';
  198.   7 : Result := 'AF_OSI or AF_ISO';
  199.   8 : Result := 'AF_ECMA';
  200.   9 : Result := 'AF_DATAKIT';
  201.   10: Result := 'AF_CCITT';
  202.   11: Result := 'AF_SNA';
  203.   12: Result := 'AF_DLI';
  204.   13: Result := 'AF_LAT';
  205.   14: Result := 'AF_HYLINK';
  206.   15: Result := 'AF_APPLETALK';
  207.   16: Result := 'AF_NETBIOS';
  208.   17: Result := 'AF_VOICEVIEW';
  209.   18: Result := 'AF_FIREFOX';
  210.   19: Result := 'AF_UNKNOWN1';
  211.   20: Result := 'AF_BAN';
  212.   21: Result := 'AF_ATM';
  213.   22: Result := 'AF_INET6';
  214.  end;// case
  215. end; // TfrmMain.GetAddrFamily
  216.  
  217. // Returns a string of socket type
  218.  
  219. function TfrmMain.GetSocketType(iSocketType : Integer) : String;
  220. begin
  221.  case iSocketType of
  222.   SOCK_STREAM    : Result := 'STREAM';
  223.   SOCK_DGRAM     : Result := 'DATAGRAM';
  224.   SOCK_RAW       : Result := 'RAW';
  225.   SOCK_RDM       : Result := 'RDM';
  226.   SOCK_SEQPACKET : Result := 'SPS';
  227.  end;// case iSocketType
  228. end; // TfrmMain.GetSocketType
  229.  
  230. // Returns a string of protocol type
  231.  
  232. function TfrmMain.GetProtocolType(iProtocol : Integer) : String;
  233. begin
  234.  case iProtocol of
  235.   IPPROTO_IP    : Result := 'IP';
  236.   IPPROTO_ICMP  : Result := 'ICMP';
  237.   IPPROTO_IGMP  : Result := 'IGMP';
  238.   IPPROTO_GGP   : Result := 'GATEWAY';
  239.   IPPROTO_TCP   : Result := 'TCP';
  240.   IPPROTO_PUP   : Result := 'PUP';
  241.   IPPROTO_UDP   : Result := 'UDP';
  242.   IPPROTO_IDP   : Result := 'XNS IDP';
  243.   IPPROTO_ND    : Result := 'NDP';// Unofficial
  244.   IPPROTO_RAW   : Result := 'RAW';
  245.   IPPROTO_MAX   : Result := 'MAX'
  246.   else Result   := '';
  247.  end;// case iProtocol
  248. end; // TfrmMain.GetProtocolType
  249.  
  250. // Returns a string of network byte order
  251.  
  252. function TfrmMain.GetNetworkOrder(iNetworkByteOrder : Integer) : String;
  253. begin
  254.  case iNetworkByteOrder of
  255.   LITTLEENDIAN : Result := 'Little Endian';
  256.   BIGENDIAN    : Result := 'Big Endian';
  257.  end;// case iNetworkOrder
  258. end; // TfrmMain.GetNetworkOrder
  259.  
  260. // Cleans up TLists and their objects
  261.  
  262. procedure TfrmMain.CleanUpLists;
  263. var
  264.  Count : Byte;
  265. begin
  266.  if not WSProtoListFreed then
  267.  begin
  268.  // Clean up WsProtoInfo items and free WSProtoList list
  269.   if WSProtoList.Count > 0 then // we have entries
  270.   begin
  271.    for Count := 0 to WSProtoList.Count - 1 do
  272.    begin
  273.     WSProtoInfo := WSProtoList.Items[Count];
  274.     Dispose(WSProtoInfo);
  275.    end;
  276.    WSProtoList.Free;
  277.   end;
  278.    WSProtoListFreed := TRUE;
  279.  end;
  280.  if not WSNSListFreed then
  281.  begin
  282.   if WSNSList.Count > 0 then
  283.   begin
  284.   // Clean up WSNSInfo items and free WSNSList list
  285.    for Count := 0 to WSNSList.Count - 1 do
  286.    begin
  287.     WSNSInfo := WSNSList.Items[Count];
  288.     Dispose(WSNSInfo);
  289.    end;
  290.    WSNSList.Free;
  291.   end;
  292.   WSNSListFreed := TRUE;
  293.  end;
  294. end; // TfrmMain.CleanUpLists
  295.  
  296. // Call Start and if successful initialize TLists, otherwise bomb...
  297.  
  298. procedure TfrmMain.FormCreate(Sender: TObject);
  299. begin
  300.  Started := Start;
  301.  if not Started then
  302.  begin
  303.   ShowMessage('Cannot start Winsock 2.0!');
  304.   Application.Terminate;
  305.  end;
  306. // We create a list to hold the Protocols data
  307.  WSProtoList := TList.Create;
  308.  WSProtoListFreed := FALSE; //
  309. // We create a list to hold the Name Space Providers data
  310.  WSNSList    := TList.Create;
  311.  WSNSListFreed := FALSE;
  312.  GetProtocols;
  313.  GetNSProviders;
  314. end; // TfrmMain.FormCreate
  315.  
  316. // Close the application
  317.  
  318. procedure TfrmMain.Exit1Click(Sender: TObject);
  319. begin
  320. // Check if we have initialized Winsock 2 DLL, and we close it down before
  321. // we leave!
  322.  if Started then
  323.   WSACleanUp;
  324.  CleanUpLists;
  325.  Close;
  326. end; // TfrmMain.Exit1Click
  327.  
  328. // Get the data for all Name Space Providers
  329.  
  330. procedure TfrmMain.GetNSProviders;
  331. var
  332.  NoNameProviders, NPCount : Integer;
  333.  Buffer     : array[0..ArraySize] of char;
  334.  BufferSize : PDWORD;
  335.  lpNameSpaceProvider : PWSANAMESPACE_INFO;
  336.  Offset, Size : Integer;
  337. begin
  338.  BufferSize := PDWORD(ArraySize);
  339.  NoNameProviders := WSAEnumNameSpaceProviders(@BufferSize,@Buffer);
  340.  if NoNameProviders = SOCKET_ERROR then
  341.  begin
  342.   sbStatusMsg.Panels[0].Text := 'Error : ' + WSAErrorMsg;
  343.   ShowMessage('Call to WSAEnumNameSpaceProviders failed!');
  344.   Exit;
  345.  end;
  346.  lpNameSpaceProvider :=  PWSANAMESPACE_INFO(@Buffer[0]);
  347.  Size := SizeOf(lpNameSpaceProvider^);
  348.  for NPCount := 0 to NoNameProviders - 1 do
  349.  begin
  350. // Create a new entry for a name space provider and then add the data to the list
  351.   with lpNameSpaceProvider^ do
  352.   begin
  353.    New(WSNSInfo);
  354.    with WSNSInfo^ do
  355.    begin
  356.     ProviderID    := NSProviderID;
  357.     NameSpace     := dwNameSpace;
  358.     Active        := fActive;
  359.     Version       := dwVersion;
  360.     Identifier    := String(lpszIdentifier);
  361.    end;
  362.    WSNSList.Add(WSNSInfo);
  363.   end;// with lpNameSpaceProvider
  364.   Offset := Size * NPCount;
  365.   lpNameSpaceProvider := PWSANAMESPACE_INFO(@Buffer[Offset]);
  366.  end;// for
  367. // populate the Name Space Providers List box
  368.  for NPCount := 0 to WSNSList.Count - 1 do
  369.  begin
  370.   WSNSInfo := WSNSList.Items[NPCount];
  371.   lbNameSpaceProviders.Items.Add(GetNameSpaceProviders(WSNSInfo^.NameSpace));
  372.  end;
  373.  lbNameSpaceProviders.ItemIndex := 0;
  374. // Populate other fields using lbNameSpaceProviders.ItemIndex marker to
  375. // synchronize
  376.  UpdateNSPFields;
  377. end; // TfrmMain.GetNSProviders
  378.  
  379. procedure TfrmMain.UpdateProtoFields;
  380. begin
  381.  WSProtoInfo := WSProtoList.Items[lbProtocols.ItemIndex];
  382.  with WSProtoInfo^ do
  383.  begin
  384.   cbConnLess.Checked          := ConnectionLess;
  385.   cbMsgOriented.Checked       := MsgOriented;
  386.   cbStrmOriented.Checked      := StrmOriented;
  387.   cbGuaranteedD.Checked       := GuaranteedD;
  388.   cbGuaranteedO.Checked       := GuaranteedO;
  389.   cbPsuedoStrm.Checked        := PsuedoStrm;
  390.   cbGracefulClose.Checked     := GracefulClose;
  391.   cbExpedited.Checked         := Expedited;
  392.   cbConnData.Checked          := ConnData;
  393.   cbDisConnData.Checked       := DisConnData;
  394.   cbBroadcast.Checked         := Broadcast;
  395.   cbMulticast.Checked         := Multicast;
  396.   if cbMulticast.Checked then
  397.   begin
  398.    cbRootCtrlPlane.Checked := ControlPlaneRoot;
  399.    cbRootDataPlane.Checked := DataPlaneRoot;
  400.    gbMultipoint.Visible    := TRUE;
  401.   end else
  402.   gbMultipoint.Visible     := FALSE;
  403.   cbQOS.Checked            := QOS;
  404.   cbUniSend.Checked        := UniSend;
  405.   cbUniRecv.Checked        := UniRecv;
  406.   cbIFS.Checked            := IFSHandles;
  407.   cbPartialMsg.Checked     := PartialMsg;
  408.   edCatalogEID.Text        := IntToStr(CatalogID);
  409.   edProtocol.Text          := GetProtocolType(Protocol);
  410.   edAddrFamily.Text        := GetAddrFamily(AddrFamily);
  411.   edSocketType.Text        := GetSocketType(SocketType);
  412.   edProtoVersion.Text      := IntToStr(Version);
  413.   edNetworkOrder.Text      := GetNetworkOrder(NetworkByteOrder);
  414.   edProtocolGUID.Text      := GuidToString(ProvID);
  415.  end;
  416. end; // TfrmMain.UpdateProtoFields
  417.  
  418. // Updates the contents in the controls on the NameSpaces page
  419.  
  420. procedure TfrmMain.UpdateNSPFields;
  421. begin
  422.  WSNSInfo := WSNSList.Items[lbNameSpaceProviders.ItemIndex];
  423.  with WSNSInfo^ do
  424.  begin
  425.   ckbActive.Checked := Active;
  426.   edVersion.Text := IntToStr(Lo(Version)) + '.' + IntToStr(Hi(Version));
  427.   edIdentifier.Text := Identifier;
  428.   with ProviderID do
  429.    edNSPGuid.Text := GUIDToString(ProviderID);
  430.  end;
  431. end; // TfrmMain.UpdateNSPFields
  432.  
  433. // Get the data for all transport protocols 
  434.  
  435. procedure TfrmMain.GetProtocols;
  436. var
  437.  lpProtocol : PWSAPROTOCOL_INFO;
  438.  Buffer     : array[0..ArraySize] of char;
  439.  BufferSize : PDWORD;
  440.  ProtocolCount,
  441.  Size, Offset : Integer;
  442. begin
  443.  NoProtocols := WSAEnumProtocols(NIL,@Buffer, @BufferSize);
  444.  if  NoProtocols = SOCKET_ERROR then
  445.  begin
  446.   sbStatusMsg.Panels[0].Text := 'Error : ' + WSAErrorMsg;
  447.   ShowMessage('Unable to enumerate protocols on this machine!');
  448.  end else
  449.  begin
  450.   ProtocolCount := 0;
  451.   lpProtocol := PWSAProtocol_Info(@Buffer[ProtocolCount]);
  452.   Size := SizeOf(lpProtocol^);
  453.   edNoProtocols.Text := IntToStr(NoProtocols);
  454.   while ProtocolCount <= NoProtocols - 1 do
  455.   begin
  456.    with lpProtocol^ do
  457.    begin
  458. // Create a new entry for a protocol and then add the data to the list
  459.     New(WSProtoInfo);
  460.     with WSProtoInfo^ do
  461.     begin
  462.      ProtocolNo   := ProtocolCount + 1;
  463.      ProtocolName := String(szProtocol);
  464.      Version      := iVersion;
  465.      AddrFamily   := iAddressFamily;
  466.      SocketType   := iSocketType;
  467.      Protocol     := iProtocol;
  468.      NetworkByteOrder := iNetworkByteOrder;
  469.      ProtocolOffset   := iProtocolMaxOffset;
  470.      SecurityScheme   := iSecurityScheme;
  471.      MaxSockAddr      := iMaxSockAddr;
  472.      MinSockAddr      := iMinSockAddr;
  473.      CatalogID        := dwCatalogEntryId;
  474.      MessageSize      := dwMessageSize;
  475.      ProvID           := ProviderID;
  476.      ConnectionLess   := dwServiceFlags1 and XP1_CONNECTIONLESS <> 0;
  477.      GuaranteedD      := dwServiceFlags1 and XP1_GUARANTEED_DELIVERY <> 0;
  478.      GuaranteedO      := dwServiceFlags1 and XP1_GUARANTEED_ORDER <> 0;
  479.      MsgOriented      := dwServiceFlags1 and XP1_MESSAGE_ORIENTED <> 0;
  480.      PsuedoStrm       := dwServiceFlags1 and  XP1_PSEUDO_STREAM <> 0;
  481.      GracefulClose    := dwServiceFlags1 and XP1_GRACEFUL_CLOSE <> 0;
  482.      Expedited        := dwServiceFlags1 and XP1_EXPEDITED_DATA <> 0;
  483.      ConnData         := dwServiceFlags1 and XP1_CONNECT_DATA <> 0;
  484.      DisConnData      := dwServiceFlags1 and XP1_DISCONNECT_DATA <> 0;
  485.      BroadCast        := dwServiceFlags1 and XP1_SUPPORT_BROADCAST <> 0;
  486.      MultiCast        := dwServiceFlags1 and XP1_SUPPORT_MULTIPOINT <> 0;
  487.      if MultiCast then
  488.      begin
  489.       ControlPlaneRoot := dwServiceFlags1 and XP1_MULTIPOINT_CONTROL_PLANE = 1;
  490.       DataPlaneRoot    := dwServiceFlags1 and XP1_MULTIPOINT_DATA_PLANE = 1;
  491.      end;
  492.      QOS               := dwServiceFlags1 and  XP1_QOS_SUPPORTED <> 0;
  493.      UniSend           := dwServiceFlags1 and  XP1_UNI_SEND <> 0;
  494.      UniRecv           := dwServiceFlags1 and  XP1_UNI_RECV <> 0;
  495.      IFSHandles        := dwServiceFlags1 and  XP1_IFS_HANDLES <> 0;
  496.      PartialMsg        := dwServiceFlags1 and  XP1_PARTIAL_MESSAGE <> 0;
  497.      ProviderFlags     := dwProviderFlags;
  498.     end;
  499.     WSProtoList.Add(WSProtoInfo);
  500.    end;//
  501.    inc(ProtocolCount);
  502.    Offset := ProtocolCount * Size;
  503.    lpProtocol  := PWSAProtocol_Info(@Buffer[Offset]);
  504.   end;// while
  505. //Populate Protocol Name field
  506.   for ProtocolCount := 0 to WSProtoList.Count - 1 do
  507.   begin
  508.    WSProtoInfo := WSProtoList.Items[ProtocolCount];
  509.    lbProtocols.Items.Add(WSProtoInfo^.ProtocolName);
  510.   end;
  511.   lbProtocols.ItemIndex := 0;
  512.  end;
  513. // Now populate other fields using lbProtocols.ItemIndex to synchronize the
  514. // fields with the protocol name field
  515.  UpDateProtoFields;
  516. end;// TfrmMain.GetProtocols;
  517.  
  518. // Return a string of the NameSpace
  519.  
  520. function TfrmMain.GetNameSpaceProviders(NameSpace : DWORD) : String;
  521. begin
  522.  case NameSpace of
  523.   NS_ALL                 : Result := 'ALL';
  524.   NS_SAP                 : Result := 'SAP';
  525.   NS_NDS                 : Result := 'NDS';
  526.   NS_PEER_BROWSE         : Result := 'Peer Browse';
  527.   NS_TCPIP_LOCAL         : Result := 'TCP/IP Local';
  528.   NS_TCPIP_HOSTS         : Result := 'TCP/IP Hosts';
  529.   NS_DNS                 : Result := 'DNS';
  530.   NS_NETBT               : Result := 'NETBT';
  531.   NS_WINS                : Result := 'WINS';
  532.   NS_NBP                 : Result := 'NBP';
  533.   NS_MS                  : Result := 'MS';
  534.   NS_STDA                : Result := 'STDA';
  535.   NS_NTDS                : Result := 'NTDS';
  536.   NS_X500                : Result := 'X500';
  537.   NS_NIS                 : Result := 'NIS';
  538.   NS_NISPLUS             : Result := 'NISPLUS';
  539.   NS_WRQ                 : Result := 'WRQ';
  540.  end;// case NameSpace
  541. end;// TfrmMain.GetNameSpaceProviders
  542.  
  543. // Show the About box..
  544.  
  545. procedure TfrmMain.About1Click(Sender: TObject);
  546. begin
  547.  frmAbout := TfrmAbout.Create(Self);
  548.  frmAbout.ShowModal;
  549.  frmAbout.Free;
  550. end; // TfrmMain.About1Click
  551.  
  552. // Update the contents in the controls on the Protocols page
  553.  
  554. procedure TfrmMain.lbProtocolsClick(Sender: TObject);
  555. begin
  556.  UpdateProtoFields;
  557. end; //  TfrmMain.lbProtocolsClick
  558.  
  559. // Update the contents in the controls on the NameSpaces page
  560.  
  561. procedure TfrmMain.lbNameSpaceProvidersClick(Sender: TObject);
  562. begin
  563.  UpdateNSPFields;
  564. end; //TfrmMain.lbNameSpaceProvidersClick
  565.  
  566. end.
  567.  
  568.