以下情况:
我有一个工作的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
复制相似问题