C ++ MSAPI 5: SetNotifyCallbackFunction funktioniert nicht

Also habe ich das ausprobiertMSAPI 5.4 TTS mit Ereignisbeispiel. Jetzt erstelle ich eine Cmd-Eingabeaufforderungs-App, die die SetNotifyCallbackFunction verwendet, aber die Funktion, die ich übergeben habe, wird nicht aufgerufen. Ich bin kein C ++ - Experte, daher habe ich Schwierigkeiten, dieses Problem zu lösen. Kann mich jemand in die richtige Richtung weisen oder mir zumindest ein gutes Beispiel für die SetNotifyCallbackFunction geben?

Hier ist eine vereinfachte Version meines Codes:

typedef void __stdcall SPNOTIFYCALLBACK(WPARAM wParam, LPARAM lParam);

void __stdcall outsideeventFunction(WPARAM, LPARAM);

void __stdcall outsideeventFunction(WPARAM wParam, LPARAM lParam){
    std::cout << "Event called::wParam: " << wParam << " lParam: " << lParam << std::endl;
    SPEVENT eventItem;
    memset(&eventItem, 0, sizeof(SPEVENT));
    while (SUCCEEDED(pV->GetEvents(1, &eventItem, NULL)))
    {
        bool exitNa = false;
        switch (eventItem.eEventId)
        {
        case SPEI_WORD_BOUNDARY:
            SPVOICESTATUS eventStatus;
            pV->GetStatus(&eventStatus, NULL);
            ULONG start, end;
            start = eventStatus.ulInputWordPos;
            end = eventStatus.ulInputWordLen;
            std::cout << "From event Test: " << start << ", " << end << std::endl;
            std::cout << "From event Length: " << theString.length() - 1 << ", " << start + end << std::endl;
            if (theString.length() - 1 <= start + end){
                std::cout << "From event Exit!" << std::endl;
                exitNa = true;
            }
            break;
        }

        SpClearEvent(&eventItem);
        if (exitNa){
            break;
        }
    }
    return;
}

int _tmain(int argc, TCHAR* argv [], TCHAR* envp [])
{
    pV = NULL;
    std::string nativeString("Hello world, this is a test! For the purpose of a longer message, I'll add another sentence. And here comes the new sentence.");
    SPNOTIFYCALLBACK *cb = &outsideeventFunction;
    if (FAILED(::CoInitialize(NULL)))
        return FALSE;

    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **) &pV);
    if (SUCCEEDED(hr))
    {
        if (SUCCEEDED(pV->SetNotifyCallbackFunction(cb, 0, 0))){
            std::cout << "Success adding callback" << std::endl;
        }

        ULONGLONG ullMyEvents = SPFEI(SPEI_WORD_BOUNDARY);
        pV->SetInterest(ullMyEvents, ullMyEvents);
    }

    theString = std::wstring(nativeString.begin(), nativeString.end());

    printf("Speak: %s\n", nativeString.c_str());
    hr = pV->Speak(theString.c_str(), SPF_ASYNC, NULL);
    pV->WaitUntilDone(INFINITE);

    std::system("pause");
    pV->Release();
    pV = NULL;
    ::CoUninitialize();
    return TRUE;
}

Das Ergebnis dieser App ist, dass das Synthetisieren von Wörtern reibungslos erfolgt, die outsideeventFunction jedoch nie aufgerufen wurde. Wie Sie sehen, ist das SetInterest richtig eingestellt. Wie kann ich das beheben?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage