使用 Windows V2 凭据提供程序的钻石继承

Diamond inheritance using Windows V2 Credential Providers

本文关键字:程序 钻石 继承 Windows V2 使用      更新时间:2023-10-16

以下情况:

我有一个实现IConnectableCredentialProviderCredential接口的工作 V1 CP。此依赖项是访问我需要的IQueryContinueWithStatus接口所必需的。

class CCredential : public IConnectableCredentialProviderCredential
{
    [...]

IConnectableCredentialProviderCredential实现ICredentialProviderCredential .

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

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)是没有选择的,因为在请求不支持IQueryContinueWithStatus的 CredUI 的情况下,qitOnlyCredUI是必要的。

class CCredential : public IConnectableCredentialProviderCredential,
                    public ICredentialProviderCredential2,
                    public ICredentialProviderCredentialWithFieldOptions
{
    [...]

ICredentialProviderCredential2实现ICredentialProviderCredential .

实现 COM QueryInterface方法,如下所示:

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基类的定义不明确。

任何想法如何实现?

您需要为您的

案例使用 QITABENTMULTI() 宏。它记录在 shlwapi.h .我不知道为什么它不在MSDN上。