【发布时间】: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::...。后者不是有效的(即当前定义的)地址前缀。
标签: visual-c++ ipv6 dcom