Как реализовать интерфейс с заданным заголовочным файлом?

[routerLink] - вход, обратите внимание на []. Таким образом, Angular решит это немедленно и каждый цикл обнаружения изменений, чтобы удовлетворить шаблон. Вы хотите использовать (click), который является выводом, обратите внимание на () и будет вызываться только при нажатии кнопки. Затем вместо того, чтобы возвращать URL-адрес функции submitSurvey(), вызовите router.navigate () (сначала введите маршрутизатор.)

html

<button class="btn btn-primary" (click)="submitSurvey()" routerLinkActive="active">Finish</button>

ts

constructor(private router: Router) { }

public submitSurvey(): void {
  // Make sure everything is answered
  const allOKClientSide: boolean = this.surveyService.checkEntireForm(this.thisSurvey);

  if (allOKClientSide) {
    if (this.surveyService.checkFormOnline(this.thisSurvey).subscribe()) {
      this.router.navigateByUrl('/placeOne');
      return;
    }
  }

  this.router.navigateByUrl('/placeTwo');
}
0
задан Will I Am 19 January 2019 в 03:08
поделиться

1 ответ

Чтобы реализовать внешний интерфейс в объекте ATL, нужно

  • добавить интерфейс в список реализованных интерфейсов (вы это сделали). Это изменит двоичное расположение класса (vtable и т. Д.)
  • и добавит интерфейс в список BEGIN_COM_MAP. Это даст команду ATL, лежащему в основе реализации QueryInterface, ответить положительно на запросы для этого идентификатора интерфейса (вы это сделали). IUnknown здесь не нужно.
  • добавить объявление интерфейса в файл .h. Связи и аннотации там необязательны, я лично их удаляю. Я также всегда добавляю примечание с именем интерфейса, чтобы мы знали, какой метод используется каким интерфейсом. Когда у тебя много, это полезно ...
  • добавить реализацию интерфейса в файл .cpp.

Так что в вашем случае это будет для файла .h:

class ATL_NO_VTABLE CExternalConTest :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CExternalConTest, &CLSID_ExternalConTest>,
    public IExternalCon // change the class layout
{
public:
...

BEGIN_COM_MAP(CExternalConTest)
    COM_INTERFACE_ENTRY(IExternalCon) // answer to QueryInterface calls
END_COM_MAP()
...

public:
    // IExternalCon
    HRESULT GetName(ULONG *interface);
...
    // IWhatever
    HRESULT Blabla( ... );
    HRESULT Blabla2( ... );

...

и для файла .cpp:

// CExternalConTest
...
// IExternalCon
HRESULT CExternalConTest::GetName(ULONG *interface)
{
    // TODO : implement this
    return S_OK;
}
...
// IWhatever
HRESULT CExternalConTest::Blabla(...)
{
    // TODO : implement this
    return S_OK;
}

HRESULT CExternalConTest::Blabla2(...)
{
    // TODO : implement this
    return S_OK;
}

Относительно .idl вам не нужно ничего делать, потому что Visual Studio использует его в качестве основы для генерации кода. Обычно при использовании Visual Studio вы сначала изменяете .idl (используя мастера или нет), а затем заполняете пробелы.

0
ответ дан Simon Mourier 19 January 2019 в 03:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: