从本机C++类的实例回调到C++/CX ref类的最佳方法是什么



我正在编写一个C++WinRT组件DLL,用于我的基于.NET的WinRT应用程序。DLL定义了一个SoundSample ref类,该类通过调用IXAudio2::CreateSourceVoice来创建XAudio语音。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++中实现回调的过程,到目前为止我还没有找到一个合理的解决方案。做这件事最好/最简单的方法是什么?

解决了它(多亏了Jeremiah Morrill)-问题不在于任何障碍阻止在基类中使用ref类。C4430意味着SoundSample是一个未被识别的类型,它被Intellisense隐藏了——因为这似乎表明SoundSample是已知的。需要添加的是SoundSample类型的声明,这一切都开始正常工作。

我刚刚添加了

namespace MyNamespace { ref class SoundSample; }

在SoundCallback类声明之前,然后SoundCallback类可以声明:

MyNamespace::SoundSample^ sample;

相关内容

  • 没有找到相关文章

最新更新