Алмазное наследование с использованием учетных данных Windows V2

Следующая ситуация:

У меня есть рабочий 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 Базовый класс.

Есть идеи, как это можно сделать?

0

Решение

Вам нужно будет использовать QITABENTMULTI() макрос для вашего случая. Это задокументировано в shlwapi.h, Я понятия не имею, почему это не на MSDN.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]