我正在尝试使用
GetLocalAddressList()
中引用的
https://www.indyproject.org/2014/03/14/tidstack-addlocaladdressestolist-method-is-now-deprecated/
我已经将Delphi代码翻译成C++了
#include <IdStack.hpp>
TIdStackLocalAddressList* LList;
TIdStackLocalAddress* LAddr;
int idx;
try {
LList = new TIdStackLocalAddressList();
try {
GStack->GetLocalAddressList(LList);
for (idx = 0; idx < LList->Count - 1; idx++) {
LAddr = LList->Addresses[idx];
switch (LAddr->IPVersion) {
case Id_IPv4:
// Add to list Items
ListBox1->Items->Add(LAddr->IPAddress);
break;
case Id_IPv6:
break;
default:;
}
}
} catch (...) {
}
} __finally
{
delete LList;
}
我明白了
Project Project1.exe 引发异常类 0xc0000005,并显示消息“在地址 0x408b38 处遇到异常 0xc0000005:读取位置 0x00000000 时发生访问冲突”。
当我执行
GStack->GetLocalAddressList(LList);
时
我认为这是因为我还没有创建 GStack 对象,但我没有关于如何/何时执行此操作的参考。我在网上查看过,似乎找不到任何使用 Indy 与 Builder 的好的参考:(
有人可以帮忙吗?谢谢提前。
GStack
是一个全局单例对象,Indy 使用它来抽象对特定于平台的 API 的访问。
如果您在运行此代码时还有其他 Indy 组件处于活动状态,则已经为您创建了
GStack
对象。但如果没有存活的对象,则必须先创建 GStack
对象才能使用它。
幸运的是,单例是引用计数的——它在添加第一个引用时创建,然后在删除最后一个引用时销毁。
TIdStack
类具有用于管理此引用计数的公共 static
方法。如果您不确定其他 Indy 组件是否还活着,则应该在直接使用 GStack
时使用这些方法,例如:
TIdStack::IncUsage(); // creates GStack if needed
try
{
// now you can safely use GStack as needed...
}
__finally
{
TIdStack::DecUsage(); // destroys GStack if needed
}
顺便说一句,在使用
for
比较时,您的 1
循环不应从 LList->Count
中减去 <
。循环应该是:
for (idx = 0; idx < LList->Count; idx++)
谢谢@雷米。是的,这适用于独立使用,加载组合框以供用户选择绑定 IP。对于具有多个 NIC 的较新计算机,我需要一种方法让用户选择使用哪个网络与其他应用程序通信。
对于那些寻找如何执行此操作的人,以下是修改后的代码:
#include <IdStack.hpp>
// ----------------------------
TIdStackLocalAddressList* LList;
TIdStackLocalAddress* LAddr;
int idx;
try {
LList = new TIdStackLocalAddressList();
TIdStack::IncUsage(); // creates GStack if needed
try {
GStack->GetLocalAddressList(LList);
for (idx = 0; idx < LList->Count; idx++) {
LAddr = LList->Addresses[idx];
switch (LAddr->IPVersion) {
case Id_IPv4:
// Add to list Items
ListBox1->Items->Add(LAddr->IPAddress);
break;
case Id_IPv6:
// Right Now I don't care about IPv6
break;
default:;
}
}
} catch (...) {
}
} __finally
{
TIdStack::DecUsage(); // destroys GStack if needed
delete LList;
}
//
我的应用程序正在使用第二个 NIC 进行 IP 音频 (AOIP),我不希望应用程序使用与音频相同的 NIC。