Каков наилучший способ получить обратный вызов от экземпляра собственного класса C++ к классу ссылок C++/CX?

Я пишу DLL-библиотеку компонента WinRT на C++ для использования в моем приложении WinRT на основе .NET. Библиотека DLL определяет класс ссылки SoundSample, который создает голос XAudio, вызывая IXAudio2::CreateSourceVoice. CreateSourceVoice принимает параметр «IXAudio2VoiceCallback *pCallback», чтобы включить обратные вызовы для различных аудиособытий. Теперь я пытаюсь реализовать этот обратный вызов на основе эта статья. XAudio предположительно просто перезвонит в методы моего класса SoundCallback, определенные как:

#pragma once
#include "xaudio2.h"
#include "pch.h"

class SoundCallback
    : public IXAudio2VoiceCallback
{
private:
    //SoundSample^ sample; //does not compile

public:
    SoundCallback(void);
    ~SoundCallback(void);

    //Called when the voice has just finished playing a contiguous audio stream.
    void OnStreamEnd();
    void OnVoiceProcessingPassEnd();
    void OnVoiceProcessingPassStart(UINT32 SamplesRequired);
    void OnBufferEnd(void * pBufferContext);
    void OnBufferStart(void * pBufferContext);
    void OnLoopEnd(void * pBufferContext);
    void OnVoiceError(void * pBufferContext, HRESULT Error);
};

Все в порядке, пока я не пытаюсь выяснить, как выполнить обратный вызов из экземпляра моего собственного класса обратного вызова в родительский объект SoundSample. Я думал, что могу передать экземпляр класса SoundSample объекту SoundCallback, но, похоже, это не позволяет мне объявить поле класса ref в нативном классе:

SoundCallback.h(9): error C2143: syntax error : missing ';' before '^'
SoundCallback.h(9): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
SoundCallback.h(9): error C3699: '^' : cannot use this indirection on type 'int'

Я оглядывался назад на реализацию обратных вызовов в родном C++ и пока не смог найти разумного решения. Каков наилучший/самый простой способ сделать это?


person Filip Skakun    schedule 03.04.2012    source источник
comment
Кстати, если вы знаете какой-либо способ решить эту проблему - это поможет. Я довольно ржавый в С++, и единственное, что приходит мне на ум на данный момент, связано с тем, что экземпляр класса ref запускает поток / работает в потоке пула потоков и ждет событий потоков, исходящих от собственного класса - с такими вещами, как SetEvent, ResetEvent , WaitForSingleObject и т. д.   -  person Filip Skakun    schedule 03.04.2012
comment
Почему это помечено как C++11?   -  person Ivan    schedule 03.04.2012
comment
Я мало что знаю о С++ 11, но я бы предположил, что это проблема смешивания Windows 8 C++/CX и родного С++ - в этом могут быть некоторые аспекты С++ 11...   -  person Filip Skakun    schedule 03.04.2012
comment
хорошо, хотя я действительно не думаю, что это может быть достаточной причиной для пометки чего-либо. Исходя из этого, вы можете пометить большинство сообщений C++ тегом C++11.   -  person Ivan    schedule 05.04.2012
comment
Верно, извини. Наверное, я просто искал широкую аудиторию...   -  person Filip Skakun    schedule 05.04.2012
comment
@Ivan: Возможно - достаточно веская причина для включения тега. В случае, если кто-то, достаточно разбирающийся в предмете, решит, что тег не применяется, он может просто удалить его. С другой стороны, если вопрос был задан без тега, шансы на то, что он будет добавлен позже, невелики. Удаление тега не повредит (во всяком случае, не сильно). Однако создание вопросов и ответов, которые потенциально труднее обнаружить, противоречит духу этого сайта.   -  person IInspectable    schedule 29.08.2016


Ответы (1)


Решил (спасибо Jeremiah Morrill) - проблема не в каком-либо барьере, блокирующем использование ref-классов в базовых классах. C4430 означает, что SoundSample — это нераспознанный тип, который был скрыт Intellisense, поскольку это указывает на то, что SoundSample известен. Что нужно добавить, так это объявление типа SoundSample, и все это начинает работать нормально.

я только что добавил

namespace MyNamespace { ref class SoundSample; }

перед объявлением класса SoundCallback, а затем класс SoundCallback мог бы объявить:

MyNamespace::SoundSample^ sample;
person Filip Skakun    schedule 03.04.2012