在 C++ 中使用 GStack->GetLocalAddressList(LList) 的问题

问题描述 投票:0回答:2

我正在尝试使用

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 的好的参考:(

有人可以帮忙吗?谢谢提前。

c++builder indy
2个回答
0
投票

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++)

0
投票

谢谢@雷米。是的,这适用于独立使用,加载组合框以供用户选择绑定 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。

© www.soinside.com 2019 - 2024. All rights reserved.