使用“HNetCfg.NATUPnP”Ole 对象进行端口转发失败

2023-12-03

我正在使用转发端口的代码。这段代码在我的 Windows 7 上运行良好;但我无法在 Windows XP 上使用它。

问题更新1(2012-10-17 07:32:00Z)

这是我的源代码:

uses
  ActiveX, oleAuto;

Procedure AddUPnPEntry(Port: Integer; const Name: ShortString; LAN_IP: string);
Var
  Nat: Variant;
  Ports: Variant;
  SavedCW: Word;
Begin
  if NOT(LAN_IP = '127.0.0.1') then
  begin
    try
      Nat := CreateOleObject('HNetCfg.NATUPnP');
      Ports := Nat.StaticPortMappingCollection;

      // Error Raized From Here!!!
      ShowMessage(inttostr(Ports.count));

      Ports.Add(Port, 'TCP', Port, LAN_IP, True, name);
    except
      ShowMessage('An Error occured with adding UPnP Ports. The ' + name +
        ' port was not added to the router. Please check to see if  your ' +
        'router supports UPnP and has it enabled or disable UPnP.');
    end;
  end;
End;

procedure TForm1.Button2Click(Sender: TObject);
begin
  AddUPnPEntry(1234, 'Hello3', '192.168.1.1');
end;

AV 错误消息:

Project Project1.exe raised exception class $C0000005 with message 'access violation at 0x00504876: read of address 0x00000000'.

如果您在访问 count 属性时遇到访问冲突,这意味着IStaticPortMappingCollection返回的接口IUPnPNAT.get_StaticPortMappingCollection方法是nil,这可能是由于您的设备不支持 UPnP、设备上未启用 UPnP、未安装/激活 UPnP 用户界面等多种原因造成的。

无论如何,为了防止这种异常(访问冲突),您必须在使用属性或方法之前检查它返回的值,在这种情况下您可以使用VarIsClear功能如下:

try
  Nat := CreateOleObject('HNetCfg.NATUPnP');
  Ports := Nat.StaticPortMappingCollection;

  if not VarIsClear(Ports) then
  begin
    //do something
    ShowMessage(inttostr(Ports.count));
    Ports.Add(Port, 'TCP', Port, LAN_IP, True, name);
  end;

except on E:Exception do
  ShowMessage('An Error occured with adding UPnP Ports. '+E.Message);
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用“HNetCfg.NATUPnP”Ole 对象进行端口转发失败 的相关文章

  • Indy FTP 传输类型

    我正在使用 IdFTP Indy 10 组件从远程位置下载一些文件 zip 和 txt 在获取每个文件之前 我将 TransferType 设置为二进制 IdFTP TransferType ftBinary IdFTP Get ASour
  • 能否从 Vista Shell 获取 48x48 或 64x64 图标?

    如果 Vista Shell 中存在 48x48 或 64x64 图标 如何使用 SHGetFileInfo 获取在 TImage 中显示图标的句柄 我想从图像列表中选择一个代表文件夹路径的图标 并在 Timage 中显示 48x48 或
  • 如何使用用户输入来寻址 Pascal 中的特定变量(Eval/Exec?)

    我正在尝试在分形程序中做一些非常具体的事情隆起7X http apophysis 7x org 使用的脚本语言是Pascal 该项目是用德尔福写的 https svn code sf net p apophysis7x svn trunk
  • Delphi - 将物理路径(设备文件句柄)转换为虚拟路径

    我怎样才能转换像这样的路径 设备 HarddiskVolume3 Windows 进入其相应的虚拟路径 如本例中的 c Windows 我个人更喜欢原生方式 function GetHDDDevicesWithDOSPath TString
  • 我需要避免尝试更新连接到 TSQLQuery 的 Delphi TClientDataset 中的非物理字段

    概要 我的代码正在尝试更新 Delphi XE 中的非物理字段TClientDataset 连接到TSQLQuery以其SQL属性集 作为运行时的结果创建Open命令 我有一个TClientDataset连接到一个TDatasetProvi
  • 如何追踪“地址 00000000”的访问违规

    我知道如何创建 map 文件来在错误消息包含实际地址时跟踪访问冲突错误 但是如果错误消息说怎么办 Access violation at address 00000000 Read of address 00000000 我从哪里开始寻找这
  • 在 Delphi 2009 上安装最新版本的 Indy 10 [重复]

    这个问题在这里已经有答案了 是否有更新 Delphi 2009 中的 Indy 10 组件的分步指南 我读过正在卸载线程 https stackoverflow com questions 486210 what is the proper
  • 在 Delphi 2007 中将具有透明度的位图保存为 PNG

    我有一个包含透明度信息的 Delphi 位图 32 位 我需要将其转换并保存为 PNG 文件 同时保留透明度 我目前拥有的工具是graphics32 Library GR32 PNG 由Christian Budde 提供 和PNGImag
  • IMAP 转发器

    我想知道从 IMAP 帐户转发邮件的最快 最可靠的方法是什么 我的大学不允许我们的学生邮箱转发到私人电子邮件帐户 这里每个人都使用 Gmail 或 Hotmail 这是一个政治问题 而不是技术问题 我们确实可以通过 IMAP 访问邮箱 我想
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • 无法更改 Xampp 中的 Apache 端口号

    我刚刚下载了Xampp服务器xampp win32 1 8 2 0 VC9 zip http www apachefriends org en xampp windows html 641文件 Windows 并尝试启动 apache 服务
  • 如何用不同的颜色绘制选定的列表框项目?

    是否可以更改 TListBox 中的项目选择焦点颜色和文本颜色 当项目中未启用主题或列表框样式设置为所有者绘制时 项目周围的选择将被涂成蓝色 我相信这是由系统的外观设置全局定义的 我想将所选项目的颜色更改为自定义颜色 举个例子 结果会是这样
  • Delphi中使用FindVCLWindow调用WinHelp32(WinXP Pro SP3 32bit)

    有什么问题吗 procedure TForm1 VCLHelpClick Sender TObject var Ctrl TWinControl begin Ctrl FindVCLWindow Mouse CursorPos if Ctr
  • 从 Delphi VCL 样式获取特定字形

    我想从 VCL 样式获取特定的位图 并将其设置为按钮上的图像 它实际上是帮助问号 在位图样式编辑器中是来自表单的 btnHelp 图像 要从 VCL 样式获取视觉元素 字形 您必须使用GetElementDetails和TCustomSty
  • 将图像加载到 TImageList 并读取它们?

    我试图通过将 jpg 转换为 bmp 然后将其保存到 imagelist1 来将 jpg 加载到图像列表中 从上到下的代码片段 Selectdir 有效 fileexists 部分有效 这用于加载文件夹中的所有图像 所有图像都以 0 jpg
  • 如何从该 JAVA 文件中提取 Delphi 类以与 Android 一起使用?

    我的Delphi XE7项目需要与FTDI FT311 Android 配件芯片 http www ftdichip com Products ICs FT311D html 他们帮助提供了一个 Android 演示 其中包括他们的 JAV
  • 为什么 Delphi 中的 ADO Next 记录处理速度变慢?

    我有一个多年前开发的 Delphi 4 程序 它使用Opus 直接访问 http sourceforge net projects directaccess 按顺序搜索 Microsoft Access 数据库并检索所需的记录 Delphi
  • CharInSet 不适用于非英文字母?

    我已经将应用程序从 Delphi 2007 更新到 Delphi 2010 一切都很顺利 除了一条编译正常但不起作用的语句 If Edit1 Text 1 in S then ShowMessage Found else ShowMessa
  • 在新实例中打开 SAS 程序

    我正在尝试找出一种在单击时默认在增强编辑器的新实例中打开 SAS 程序的方法 问题是asked https stackoverflow com questions 4654876 open sas program in new window
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style

随机推荐

  • 无法查看 Azure 日志流中的日志

    在我的 Web Api 应用程序中 我有控制器 Route api controller public class ValuesController Controller GET api values HttpGet public IEnu
  • GtkDrawingArea - 如何使其可绘制?

    我有点失去理智了 我正在尝试使用 cairo 在 GTK 表单上绘制一些简单的图形 include
  • 晾干石头剪刀布

    我是一个新手 ruby 程序员 虽然这段代码可以工作 但我想知道如何改进它 我对 lambda 和 procs 等的了解非常有限 但任何建议都会很棒 有什么办法可以简化if else每种情况下的陈述 另外 有没有什么替代方法case语句被跳
  • 如何在javascript中设置JSTL变量值?

    如何在javascript中设置JSTL变量值 我如何设置 user 多变的 JSTL 来自 的值val1 JavaScript 这是不可能的 因为它们在不同的环境中执行 JSP 在服务器端 JavaScript 在客户端 因此它们不会按照
  • 在 save_post 上设置产品重量的挂钩

    有没有办法设置产品重量save post hook 我有以下代码 但我不知道如何覆盖重量 add action save post change weight function change weight post id WC Produc
  • 为 Neo4j 的 CQL 创建 NOT MATCH 命令?

    我有一个非唯一节点 Neighborhood 它唯一地出现在 IN 一个 City 节点 我想创建一个新的邻里节点 并仅当该邻里节点不存在于该城市时才建立其关系 可以有多个具有相同名称的社区 但每个社区必须在房产城市中唯一出现 遵循吉尔在这
  • 回归基础:Apache Camel 路由和直接组件

    我对骆驼路线及其两个端点有点困惑 Direct 和 Seda 好吧 假设我有一条这样的路线 public void configure from direct services process Some processing here to
  • 如何防止 Prolog 在不该回溯的地方回溯

    我正在尝试解决一个 CSP 我需要向调酒师分发鸡尾酒 以便每个调酒师最多拥有一份鸡尾酒 并且所有鸡尾酒都由调酒师提供 我通过创建 clpfd 变量列表来解决这个问题 首先为他们提供所有调酒师的完整域 然后删除所有不知道如何制作鸡尾酒的调酒师
  • KStream 和 KTable 之间的时间语义

    我正在尝试构建以下拓扑 使用 Debezium 连接器 我拉出 2 个表 我们称它们为表 A 和 DA 根据 DBZ 存储表行的主题具有结构 before after 我的拓扑中的第一步是根据这两个 表 主题创建 干净 的 KStream
  • 如何使用Advanced Drive服务上传文件

    我有以下 Google Apps 脚本 它从上传表单中获取文件并将其自动存储在我的 Google 云端硬盘中 下面的代码片段中包含完整代码 问题出在这一部分 var file folder createFile blob Get root
  • Twitter4J:获取 Twitter 帐户的所有状态

    我正在为我的应用程序使用 Twitter4J API 我想获取我的 Twitter 帐户上的所有状态 或者如果不是全部 也可以是大部分状态 这可能吗 目前我正在使用 getUserTimeline 但这只检索最后 20 非常感谢和问候 Kr
  • 我需要我的脚本在 -Whatif 输出中包含“LastWriteTime”属性

    我需要编辑在这里找到的脚本 以便我可以首先看到它将删除的文件的报告 包括文件名和路径以及 LastWriteTime 属性 以便我可以分析脚本的输出执行前几个月以及将其配置为计划任务之前 我已经尝试使用 LastWriteTime 对象属性
  • 缩放后获取 SVG 坐标中的鼠标位置

    使用 D3 v4 SVG 和缩放行为 在 mousemove 上 我想在 SVG 坐标系中显示鼠标坐标 mousemove 事件似乎仅提供客户端 屏幕坐标 如何将这些坐标转换为反映当前缩放 平移 等变换的 SVG 坐标 我可以看到使用 ax
  • 错误:绑定变量的数量与标记的数量不匹配

    我只想在数据库 mySQL 中没有对应关系的情况下进行插入 但他让我没有声明 这是片段 if sql gt rowCount gt 0 echo Non inserisci else echo Inserisci db gt beginTr
  • 带 @Value 的 Spring 表达式语言 (SpEL):美元与哈希($ 与 #)

    我对何时使用有点困惑 相比 Spring的文档仅使用 但是有很多使用的例子 此外 当我开始使用 SpEL 时 我被告知要使用 而且效果很好 对于那些感到困惑的人 我如何使用它的一个例子是 Component public class Pro
  • 从服务交互启动 .Net winforms 应用程序

    环境 VS2008 Vista SP1 我编写了一个进程管理服务 它可以在会话 0 或交互式控制台 通常是 1 中启动应用程序 请注意 这不是正常的操作模式 仅用于内部调试目的 在现场 这些进程将安全地隐藏在会话 0 中 安全问题不适用 显
  • 从 C# 中的内存流保存为 jpeg

    我有一个如下所示的方法将图像保存为 jpeg 我想以相同的高度和宽度保存所有图片而不变形 我怎样才能做到这一点 请帮忙 public void SaveFileOnDisk MemoryStream ms string FileName t
  • SQL 减去查询中前一行的值的最佳方法?

    我正在尝试计算数据库中机器丢失的总时间 表中的列是 MachineID 又名 PlantID StartTime EndTime 理论上 它只是简单地按 machineID 和 StartTime 对表进行排序 然后获取当前行的 Start
  • 如何在Cmake中链接curses.h?

    我知道也许这是一个愚蠢的问题 但我无法看透它 我在这里搜索了其他答案 这些答案与我的非常接近 但是 我仍然不明白该怎么做 问题是我无法编译在Windows中使用curses h的 C 程序 我正在将Clion与MinGW一起使用 当我尝试这
  • 使用“HNetCfg.NATUPnP”Ole 对象进行端口转发失败

    我正在使用转发端口的代码 这段代码在我的 Windows 7 上运行良好 但我无法在 Windows XP 上使用它 问题更新1 2012 10 17 07 32 00Z 这是我的源代码 uses ActiveX oleAuto Proce