首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Windows V2凭据提供程序进行钻石继承

使用Windows V2凭据提供程序进行钻石继承
EN

Stack Overflow用户
提问于 2015-12-16 18:48:38
回答 1查看 933关注 0票数 0

以下情况:

我有一个工作的V1 CP,它实现了IConnectableCredentialProviderCredential接口。这种依赖关系对于访问我需要的IQueryContinueWithStatus接口是必要的。

代码语言:javascript
运行
复制
class CCredential : public IConnectableCredentialProviderCredential
{
    [...]

IConnectableCredentialProviderCredential实现了ICredentialProviderCredential

COM IUknown查询方法使用以下代码片段完成:

代码语言:javascript
运行
复制
IFACEMETHODIMP QueryInterface(__in REFIID riid, __deref_out void** ppv)
{
    static const QITAB qitOnlyCredUI[] =
    {
        QITABENT(CCredential, ICredentialProviderCredential),
        { 0 },
    };

    static const QITAB qitFull[] =
    {
        QITABENT(CCredential, ICredentialProviderCredential), // IID_ICredentialProviderCredential
        QITABENT(CCredential, IConnectableCredentialProviderCredential), // IID_IConnectableCredentialProviderCredential            
        { 0 },
    };

[...]

现在,我希望将提供程序迁移为V2 CP,并实现ICredentialProviderCredential2接口,但要与IQueryContinueWithStatus接口保持兼容。另外,删除QITABENT(CCredential, ICredentialProviderCredential)是没有选择的,因为在请求CredUI (不支持IQueryContinueWithStatus )的情况下,qitOnlyCredUI是必需的。

代码语言:javascript
运行
复制
class CCredential : public IConnectableCredentialProviderCredential,
                    public ICredentialProviderCredential2,
                    public ICredentialProviderCredentialWithFieldOptions
{
    [...]

ICredentialProviderCredential2实现了ICredentialProviderCredential

实现COM QueryInterface方法如下:

代码语言:javascript
运行
复制
IFACEMETHODIMP QueryInterface(__in REFIID riid, __deref_out void** ppv)
{
    static const QITAB qitOnlyCredUI[] =
    {
        QITABENT(CCredential, ICredentialProviderCredential),
        { 0 },
    };

    static const QITAB qitFull[] =
    {
        QITABENT(CCredential, ICredentialProviderCredential), // IID_ICredentialProviderCredential
        QITABENT(CCredential, ICredentialProviderCredential2), // IID_ICredentialProviderCredential2
        QITABENT(CCredential, IConnectableCredentialProviderCredential), // IID_IConnectableCredentialProviderCredential            
        QITABENT(CCredential, ICredentialProviderCredentialWithFieldOptions), //IID_ICredentialProviderCredentialWithFieldOptions
        { 0 },
    };

这就是钻石问题的起点,因为ICredentialProviderCredential2IConnectableCredentialProviderCredential都实现了ICredentialProviderCredential

试图编译肯定会导致编译器抱怨ICredentialProviderCredential基类的定义不明确。

有什么办法可以做到吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-16 19:25:30

您需要为您的情况使用QITABENTMULTI()宏。它被记录在shlwapi.h中。我不知道它为什么不在MSDN上。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34319824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档