1

我正在 delphi indy 10 中开发一个 p2p 聊天应用程序。我有两个问题。

1.我正在使用此功能进行端口开放。它给出了 Coinitialize has not been called 错误。我声明了但不知道我是否在正确的位置声明了它,因为如果我在 Xp 中运行它,它仍然会给出这个错误。

2.如果我使用的是udp打孔,那为什么我需要调用这个函数?如果我不调用此功能,我将无法聊天。

  procedure AddPortThroughUPnP;

  var
  NAT     : Variant;
  Profile : Variant;
  Ports   : Variant;

begin

  if ( not fEnableUPnP ) or ( fServerRole ) then exit;

  if fWindowsName = WINXP then
  begin
  try
  Coinitialize(nil);
    NAT      := CreateOleObject ( 'HNetCfg.FwMgr' );
    Profile  := NAT.LocalPolicy.CurrentProfile;

    if not VarIsClear ( Profile ) then
    begin

      Ports          := CreateOLEObject('HNetCfg.FWOpenPort');
      Ports.Name     := 'UDP Server 6002';
      Ports.Port     := 6002;
      Ports.Scope    := 0;
      Ports.Protocol := 17;
      Ports.Enabled  := True;

      Profile.GloballyOpenPorts.Add ( Ports );

    end;
  finally
     Couninitialize;
  end;

  end
  else
  begin
         try
   Coinitialize(nil);
    NAT   := CreateOleObject ( 'HNetCfg.NATUPnP' );
    Ports := NAT.StaticPortMappingCollection;

    if not VarIsClear ( Ports ) then
       Ports.Add
       ( 6002, 'UDP', fExternalPort, fLocalIP, True, 'UDP Server 6002' );

         finally
         Couninitialize;
         end;
  end;
end;
4

0 回答 0