如何在C++/CX引用类中获取来自本地C++类实例的回调?

5

我正在编写一个用于我的基于.NET的WinRT应用程序的C++ WinRT组件DLL。该DLL定义了一个SoundSample ref类,通过调用IXAudio2::CreateSourceVoice创建一个XAudio语音。CreateSourceVoice需要一个“IXAudio2VoiceCallback *pCallback”参数以在各种音频事件上启用回调。现在,我正在尝试基于this article实现该回调。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++中实现回调的方法,但是目前还没有找到合理的解决方案。什么是最好/最简单的方法来做到这一点?


顺便说一句,如果您知道任何解决方法 - 那会很有帮助。我对C++有点生疏,目前唯一想到的是让ref类实例启动一个线程/在线程池线程上运行,并等待来自本机类的线程事件 - 使用诸如SetEvent、ResetEvent、WaitForSingleObject等功能。 - Filip Skakun
为什么这被标记为C++11? - Ivan
我对C++11了解不多,但我认为这可能是将Windows 8 C++/CX和本机C++混合使用的问题——可能涉及一些C++11方面的内容... - Filip Skakun
好的,虽然我不认为“可能是”是给某些东西打标签的充分理由。按照这种推理,你可以将大多数C++帖子都标记为C++11。 - Ivan
好的,抱歉。我想我可能只是在寻找一个广泛的受众... - Filip Skakun
@Ivan:“可能是”足以成为包含标签的理由。如果有人在该主题上有足够的知识,确定该标签不适用,则可以将其简单地删除。另一方面,如果没有标签提出问题,则很少有机会添加标签。删除标签并不会造成太大的伤害。然而,使问答对其他人更难发现与本站精神相冲突。 - IInspectable
1个回答

3
我会尽力帮助您翻译。以下是需要翻译的内容:
解决了这个问题(感谢Jeremiah Morrill),问题不在于任何阻止基本类中使用ref类的障碍。C4430意味着SoundSample是一种未被识别的类型,它被Intellisense隐藏了——因为这似乎表明SoundSample是已知的。
需要添加的是SoundSample类型的声明,然后这一切就可以正常工作了。
我只是添加了
namespace MyNamespace { ref class SoundSample; }

在SoundCallback类声明之前,可以声明一个

SoundCallback类:

MyNamespace::SoundSample^ sample;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接