我正在 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;