2012-04-03 6 views
5

मैं अपने .NET- आधारित WinRT एप्लिकेशन में उपयोग के लिए एक C++ WinRT घटक DLL लिख रहा हूं। डीएलएल एक ध्वनि नमूना रेफ क्लास को परिभाषित करता है जो IXAudio2::CreateSourceVoice पर कॉल करके XAudio आवाज बनाता है। CreateSourceVoice विभिन्न ऑडियो ईवेंट पर कॉलबैक सक्षम करने के लिए "IXAudio2VoiceCallback * pCallback" पैरामीटर लेता है। अब मैं उस कॉलबैक को this article पर लागू करने की कोशिश कर रहा हूं।देशी सी ++ कक्षा के उदाहरण से सी ++/सीएक्स रेफ क्लास में कॉलबैक प्राप्त करने का सबसे अच्छा तरीका क्या है?

#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 वस्तु के लिए कॉल करने के लिए प्रयास करें: XAudio माना जाता है कि बस के रूप में परिभाषित किया गया मेरी SoundCallback वर्ग के तरीकों में वापस कॉल करेगा। मैं सोच रहा था मैं SoundCallback वस्तु को SoundSample वर्ग का एक उदाहरण दे सकते हैं, लेकिन ऐसा लगता है जैसे कि यह मेरे देशी कक्षा में एक रेफरी वर्ग क्षेत्र घोषित करने के लिए अनुमति नहीं देता:

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' 

कार्यान्वयन के लिए मैं कॉलबैक ओर मुड़कर देखा देशी सी ++ में और मुझे अभी तक एक उचित समाधान नहीं मिला। ऐसा करने का सबसे अच्छा/आसान तरीका क्या है?

+0

Btw, यदि आप इसे हल करने के लिए किसी भी तरह से के बारे में पता - कि मदद मिलेगी। मैं सी ++ में बल्कि जंगली चीज हूं और अब मेरे दिमाग में आने वाली एकमात्र चीज शामिल है जिसमें रेफ क्लास इंस्टेंस एक थ्रेडपूल थ्रेड पर थ्रेड/चल रहा है और देशी वर्ग से आने वाली थ्रेडिंग घटनाओं की प्रतीक्षा करता है - SetEvent, ResetEvent जैसी चीजों के साथ , WaitForSingleObject इत्यादि –

+0

यह C++ 11 के साथ क्यों टैग किया गया है? – Ivan

+0

मुझे सी ++ 11 के बारे में बहुत कुछ पता नहीं है, लेकिन मुझे लगता है कि यह विंडोज 8 सी ++/सीएक्स और देशी सी ++ मिश्रण करने की समस्या है - इसमें कुछ सी ++ 11 पहलू हो सकते हैं ... –

उत्तर

3

इसे हल किया गया (Jeremiah Morrill के लिए धन्यवाद) - समस्या मूल कक्षाओं में रेफ कक्षाओं के उपयोग को अवरुद्ध करने वाले किसी बाधा के साथ नहीं है। सी 4430 का अर्थ है कि ध्वनि नमूना एक अपरिचित प्रकार है, जिसे इंटेलिसेंस द्वारा छुपाया गया था - क्योंकि ऐसा लगता है कि ध्वनि नमूना ज्ञात है। क्या जोड़ा जाना आवश्यक है SoundSample प्रकार की घोषणा है और यह सब ठीक काम करना शुरू कर देता है।

मैं सिर्फ SoundCallback वर्ग घोषणा से पहले

namespace MyNamespace { ref class SoundSample; } 

जोड़ा और फिर SoundCallback वर्ग की घोषणा कर सकता है:

MyNamespace::SoundSample^ sample; 
संबंधित मुद्दे