以下情况:
我有一个工作的V1 CP,它实现了IConnectableCredentialProviderCredential接口。这种依赖关系对于访问我需要的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)是没有选择的,因为在请求CredUI (不支持IQueryContinueWithStatus )的情况下,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 },
};这就是钻石问题的起点,因为ICredentialProviderCredential2和IConnectableCredentialProviderCredential都实现了ICredentialProviderCredential。
试图编译肯定会导致编译器抱怨ICredentialProviderCredential基类的定义不明确。
有什么办法可以做到吗?
发布于 2015-12-16 19:25:30
您需要为您的情况使用QITABENTMULTI()宏。它被记录在shlwapi.h中。我不知道它为什么不在MSDN上。
https://stackoverflow.com/questions/34319824
复制相似问题