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

Я пишу C ++ WinRT Component DLL для использования в моем .NET-приложении WinRT.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 ++, и я пока не смог найти разумного решения.Какой самый лучший / самый простой способ сделать это?

1 Ответ

3 голосов
/ 04 апреля 2012

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

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

namespace MyNamespace { ref class SoundSample; }

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

MyNamespace::SoundSample^ sample;
...