C++ 在QT中运行SAPI时会生成错误

C++ 在QT中运行SAPI时会生成错误,c++,windows,qt,text-to-speech,sapi,C++,Windows,Qt,Text To Speech,Sapi,这是我的密码: #include <sapi.h> int main(int argc, char* argv[]) { ISpVoice * pVoice = NULL; if (FAILED(::CoInitialize(NULL))) return FALSE; HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)

这是我的密码:

#include <sapi.h>

int main(int argc, char* argv[])
{
    ISpVoice * pVoice = NULL;

    if (FAILED(::CoInitialize(NULL)))
        return FALSE;

    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice;);
    if( SUCCEEDED( hr ) )
    {
        hr = pVoice->Speak(L"Hello world", 0, NULL);
        pVoice->Release();
        pVoice = NULL;
    }

    ::CoUninitialize();
    return TRUE;
}
请注意,SAPI包含在最后一个包含中,SAPI库是最后一个库

当我运行此代码时,会生成以下错误

C:\Users\yohan\Documents\QTPeojects\Tired\Speech.cpp:10: error: C2143: syntax error : missing ')' before ';'
C:\Users\yohan\Documents\QTPeojects\Tired\Speech.cpp:10: error: C2059: syntax error : ')'
我不明白为什么

更新 按照John的指示,上述错误现在消失了。但是,现在生成了以下错误。为什么呢

Speech.obj:-1: error: LNK2019: unresolved external symbol __imp__CoUninitialize@0 referenced in function _main

Speech.obj:-1: error: LNK2019: unresolved external symbol __imp__CoCreateInstance@20 referenced in function _main

Speech.obj:-1: error: LNK2019: unresolved external symbol __imp__CoInitialize@4 referenced in function _main

release\Tired.exe:-1: error: LNK1120: 3 unresolved externals
应该是

HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
在你的版本中有一个额外的分号

应该是

HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);

您的版本中有一个额外的分号。

缺少的函数在user32.lib中(但不知道如何将其添加到您的qt proj)

缺少的函数在user32.lib中(但不知道如何将其添加到您的qt proj中)

您的链接器问题源于您没有正确引用Qt.pro文件中的库

要添加库,您需要执行以下操作:-

LIBS+=-LC:/opencv/build/x86/vc9/lib/-lopencv\u calib340


请注意路径前的-L和库名称前的-L。

您的链接器问题源于您没有在Qt.pro文件中正确引用库这一事实

要添加库,您需要执行以下操作:-

LIBS+=-LC:/opencv/build/x86/vc9/lib/-lopencv\u calib340


请注意路径前的-L和库名称前的-L。

唯一的方法是添加ATL

  #define _ATL_APARTMENT_THREADED

#include <atlbase.h>
//You may derive a class from CComModule and use it if you want to override something,
//but do not change the name of _Module
extern CComModule _Module;
#include <atlcom.h>

#include <sapi.h>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    cout << "Hello" << endl;
    ISpVoice * pVoice = NULL;

    if (FAILED(::CoInitialize(NULL)))
        return FALSE;

    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
    if( SUCCEEDED( hr ) )
    {
        cout << "Succeeded" << endl;
        hr = pVoice->Speak(L"Hello world", 0, NULL);
        pVoice->Release();
        pVoice = NULL;
    }
    else
    {
        cout << "Not succeeded" << endl;
    }

    ::CoUninitialize();
    return TRUE;
}
定义ATL公寓
#包括
//如果要重写某些内容,可以从CComModule派生类并使用它,
//但不要更改_模块的名称
外部计算机模块(U模块);
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{

cout唯一的方法是添加ATL

  #define _ATL_APARTMENT_THREADED

#include <atlbase.h>
//You may derive a class from CComModule and use it if you want to override something,
//but do not change the name of _Module
extern CComModule _Module;
#include <atlcom.h>

#include <sapi.h>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    cout << "Hello" << endl;
    ISpVoice * pVoice = NULL;

    if (FAILED(::CoInitialize(NULL)))
        return FALSE;

    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
    if( SUCCEEDED( hr ) )
    {
        cout << "Succeeded" << endl;
        hr = pVoice->Speak(L"Hello world", 0, NULL);
        pVoice->Release();
        pVoice = NULL;
    }
    else
    {
        cout << "Not succeeded" << endl;
    }

    ::CoUninitialize();
    return TRUE;
}
定义ATL公寓
#包括
//如果要重写某些内容,可以从CComModule派生类并使用它,
//但不要更改_模块的名称
外部计算机模块(U模块);
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{

非常感谢您的回复。按照您的说明操作后,该错误消失了,但出现了新的错误。请查看更新的代码。这些是链接器错误,因为您没有链接到正确的导入库。这是一个与以前不同的问题,我对Windows编程不太熟悉,无法确认dent关于答案。因此,如果你自己无法理解,那么我会问另一个问题。我理解。谢谢你的帮助!谢谢你的回复。按照你的说明,该错误消失了,但出现了新错误。请查看更新的代码。这些是链接器错误,因为你没有链接到正确的导入库稀罕。这是一个与以前不同的问题,我对Windows编程不太熟悉,因此对答案没有足够的信心。因此,如果你自己无法理解,我会问另一个问题。我理解。谢谢你的帮助!谢谢你的回复,但不幸的是,它没有解决问题:9谢谢你的回复,但是不幸的是,它并没有解决问题:9I试图用mingw编译器运行上述代码,但我收到错误消息,说没有找到atlbase.h和atlcom.h的include。没有这个,代码会编译,但执行时不会发出声音。请帮助。@programmer:我的建议是不要使用SAPI。使用MS speech API C#version.SAPI有数百万的麻烦这是问题。我需要窗口的明文ViLISY,我的项目要求是使用C++。你推荐其他的语音API(除了MS)吗?C++程序员可以使用这里的代码吗?@程序员:你能用C++来帮助吗?@程序员:你可以使用C++和.net和C++吗?<代码> PoksSpHyxX< /Cord>也是一个很好的API。你可以使用<代码> VoCE < /C>。我尝试用MIW编译器运行上面的代码,但是我会出错,说ATLBASE、H和ATLCOM都没有找到包含。如果没有这个,代码编译,但执行没有声音。请帮助。@程序员:我的建议是不使用SAPI。使用MS语音API C版本。SAPI有数百万的麻烦…这是问题。我需要窗口的明文VrEISY和我的项目要求是使用C++。你推荐任何其他语音API(除MS)我可以用MIW构建它?这里真的很感谢。请程序员:你能用C++ +CLI吗?我可以让你同时使用C++和.c++。