使用 ipv6 调用 CoCreateInstanceEx

Posted

技术标签:

【中文标题】使用 ipv6 调用 CoCreateInstanceEx【英文标题】:calling CoCreateInstanceEx with ipv6 【发布时间】:2016-01-22 20:45:40 【问题描述】:

我试图通过传递一个 ipv6 地址来调用 CoCreateInstanceEx,但它因访问被拒绝而失败。有没有办法解决这个问题,还是不支持?这是一个片段:

       COSERVERINFO serverinfo;
        ZeroMemory( &serverinfo, sizeof serverinfo);
        serverinfo.pwszName = (OLECHAR *)sAddress.c_str();
        MULTI_QI qi[2];
        qi[0].pIID = &IID_IUnknown;
        qi[0].pItf = NULL;
        qi[0].hr = S_OK;
        qi[1].pIID = &IID_IXSMyIniitialize;
        qi[1].pItf = NULL;
        qi[1].hr = S_OK;
        HRESULT hr = CoCreateInstanceEx( 
            CLSID_CoSMyCOM, 
            0, 
            CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
            &serverinfo,
            2,
            qi);

如果 sAddress 类似于 10.7.10.10,它可以工作。但是,如果它类似于 fe90::a877:d1aa:43f7:5922 我会被拒绝访问。两个地址都指向同一个服务器。谢谢。

【问题讨论】:

它指向的服务器是否在同一个二层局域网上? 是的,我实际上是从 COM 服务器所在的同一台机器上调用它。 好的。您正在使用fe80::/10 链接本地网络中的地址,并且主机中的每个接口都使用相同的fe80::/10 链接本地网络,因此您必须在链接本地地址中包含范围以识别您的特定接口使用的意思。如果您使用带有 IPv6 地址的端口,则需要在附加:port 之前将地址用[] 括起来,而且有些应用程序需要括号。 谢谢,这是我缺少的区域索引(即 %10)。我确实有地址周围的括号,我只是把它们从我的帖子中删除了。顺便说一句,CoCreateInstanceEx 可以使用或不使用括号。我只需要有区域索引。 @user1375218 我想你的意思是写fe80::...,而不是fe90::...。后者不是有效的(即当前定义的)地址前缀。 【参考方案1】:

请看我上面的评论,这是我缺少的区域索引。

【讨论】:

虽然这可能是解决问题的宝贵提示,但答案确实需要证明解决方案。请edit 提供示例代码来说明您的意思。或者,考虑将其写为评论。 我的意思是地址,例如fe80::a877:d1aa:43f7:5922,必须后跟区域 id,例如fe80::a877:d1aa:43f7:5922%10。由于地址不是硬编码的,因此无需编辑代码 sn-p。谢谢。

以上是关于使用 ipv6 调用 CoCreateInstanceEx的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 OLE 自动化服务器时设置当前目录

winsock2:服务器端代码调用`accept()`后如何获取已连接客户端的ipv4/ipv6地址

由于 IPv6 问题,Apple 构建被拒绝

如何在 Vista/Windows7 中添加持久 IPv6 地址?

由于IPv6导致的iOS应用发布失败,是否该怪Azure?

Twitter Kit RestAPI不支持IPv6? - 拒绝了Apple