Следующая ситуация:
У меня есть рабочий 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 },
};
[...]
Теперь я хочу перевести провайдера в CP V2 и реализовать ICredentialProviderCredential2
интерфейс, но оставаться совместимым с IQueryContinueWithStatus
интерфейс. Кроме того, сбросив QITABENT(CCredential, ICredentialProviderCredential)
выход не вариант, потому что qitOnlyCredUI
необходим в случае запроса CredUI, который не поддерживает IQueryContinueWithStatus
,
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
Базовый класс.
Есть идеи, как это можно сделать?
Вам нужно будет использовать QITABENTMULTI()
макрос для вашего случая. Это задокументировано в shlwapi.h
, Я понятия не имею, почему это не на MSDN.
Других решений пока нет …