0

Julius API を使用して、音声認識用に C++ でインターフェイス クラスを作成します。http://julius.sourceforge.jp/en_index.php?q=index-en.html .

さて、私のクラスにはいくつかのイベントがあり、これらのイベントは Julius API によってトリガーされます。Julius API には、このシグネチャを持つ関数呼び出し callback_add があります。

int callback_add (Recog *recog, int code, void(*func)(Recog *recog, void *data), void data)

いくつかの「プロキシ」関数を使用してイベントを呼び出し、この関数を callback_add に渡します。

プロパティ イベントが静的である場合は正常に動作しますが、非静的である場合、プロキシ関数内でプロパティが認識されません。

難しいのは、callback_add 関数を使用する必要があり、これを変更できないためです。

2 つのイベント (静的および非静的) を持つクラスの概要を次に示します。

ヘッダ

#ifndef FALAENGINE_H_
#define FALAENGINE_H_

#pragma once

extern "C"{
#include <julius/julius.h>
}

namespace FalaAPI {

    public ref class FalaEngine
    {
    public:
        FalaEngine();
        ~FalaEngine();

        // Events
        delegate void OnRecognizedDele(FalaAPI::RecoResult^ result);
        static property OnRecognizedDele^ OnRecognized;

        delegate void OnEngineStartDele();
        property OnEngineStartDele^ OnEngineStart;

    private:
        Recog *recog;
        Jconf *jconf;
    };
}

#endif /* FALAENGINE_H_*/

ソース

#include "stdafx.h"

using System::String;
using System::Console;

#include "FalaEngine.h"
#include <windows.h>

namespace FalaAPI{
    void StartOnEngineStart()(Recog *recog, void * dummy){
        if(FalaEngine::OnEngineStart->GetInvocationList()->Length > 0)
            FalaEngine::OnEngineStart->Invoke();
    }

    void StartOnRecognized()(Recog *recog, void * dummy){
        if(FalaEngine::OnRecognized->GetInvocationList()->Length > 0)
            FalaEngine::OnRecognized->Invoke();
    }

    FalaEngine::FalaEngine(){
        recog = j_recog_new();
        jconf = j_jconf_new();

        //Julius callback Functions
        callback_add(recog, CALLBACK_EVENT_PROCESS_ONLINE, StartOnEngineStart, NULL);

        callback_add(recog, CALLBACK_RESULT, StartOnRecognized, NULL);
    }
}

StartOnEngineStart 関数内で問題が発生します。

エラー C2227: '->GetInvocationList' の左側は、class/struct/union/generic 型を指している必要があります

4

1 に答える 1

0

非静的メンバーは、各インスタンスに個別に存在します。検査するデリゲートを含むインスタンスを指定していません。指定したのはクラスのみです(インスタンスが多数ある場合もあります)。

dummyパラメータを使用してインスタンスを渡してみてください。ただし、ガベージコレクターは、オブジェクトを固定しない限りオブジェクトを移動するため、アドレスを渡すだけでは機能しないので注意してください。代わりに、を作成して渡す必要がありますGCHandle。(GCHandleをリークしないように注意してください。リークしないと、オブジェクトが解放されません)


このようなものが効果的であるはずです:

ref class FalaEngine;

struct EngineHandle
{
    gcroot<FalaEngine^> handle;
    EngineHandle(FalaEngine^ engine) : handle(engine) {}
};

public ref class FalaEngine
{
    clr_scoped_ptr<EngineHandle> callback_ptr;
public:
    FalaEngine();
    ~FalaEngine();

    // Events
    delegate void OnRecognizedDele(FalaAPI::RecoResult^ result);
    property OnRecognizedDele^ OnRecognized;


    delegate void OnEngineStartDele();
    property OnEngineStartDele^ OnEngineStart;

private:
    Recog *recog;
    Jconf *jconf;
};

void StartOnEngineStart(Recog *recog, void * dummy)
{
    FalaEngine^ that = static_cast<EngineHandle*>(dummy)->handle;
    that->OnEngineStart(); // C++/CLI already checks if the invocation list is empty
}


void StartOnRecognized(Recog *recog, void * dummy)
{
    FalaEngine^ that = static_cast<EngineHandle*>(dummy)->handle;
    that->OnRecognized(recog->get_result());
}

FalaEngine::FalaEngine()
    : callback_ptr(new EngineHandle(this))
{
    recog = j_recog_new();
    jconf = j_jconf_new();


    //Julius callback Functions
    callback_add(recog, CALLBACK_EVENT_PROCESS_ONLINE, StartOnEngineStart, callback_ptr.get());

    callback_add(recog, CALLBACK_RESULT, StartOnRecognized, callback_ptr.get());

}

clr_scoped_ptrクラスはこちらです。 ライセンス要件はそれほど多くありませんが、使用する場合は必ずそれに従ってください。

于 2012-06-30T14:27:23.323 に答える