18

请看下面的代码

#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;
}

我正在使用 QT。当我运行这段代码时,我得到了错误

无法打开包含文件:'atlbase.h':没有这样的文件或目录

我注意到我没有文件atlbase.hatlcom.h在我的机器中。但是,这段代码在我的笔记本电脑上运行没有错误,我在那里得到了这两个文件。

我正在考虑将这 2 个文件的副本复制到我的台式计算机中,它会起作用吗?如果是,我必须将它们复制到哪个文件夹?我是 Windows 编程、QT 和语音的新手。

4

5 回答 5

19

对我来说,这些文件位于此处:

VS2010 - C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\atlbase.h
VS2008 - C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\include\atlbase.h

请注意 ATL 是 Microsoft Visual Studio 的一部分(但不是 Express Edition)。如果您需要为 Express 获取 ATL,请查看此主题如何将 WTL 和 ATL 添加到 Visual Studio C++ Express 2008

我不认为复制atlbase.hatlcom.h会帮助你。您可能会尝试获取所有 atl*.h 文件并安装所需的 Microsoft Visual C++ Redistributable 包。

于 2013-05-06T18:05:25.373 回答
7

该代码不需要这些标头。删除extern CComModule _Module;和 atl 标头。添加#include <windows.h>.

于 2013-05-06T18:45:34.127 回答
1

ATL 和 MFC 附带 VC++ 的零售版本。将所需的包含和库 (atl*.lib) 放置在哪里并不重要。只需在 IDE 中为它们提供正确的路径。

于 2013-05-06T18:08:52.923 回答
1

拥有头文件肯定是朝着正确方向迈出的一步,但是您还需要库才能进行编译(除非所有内容都在头文件中实现)。您可以将标题放置在您喜欢的位置,只需确保链接器找到它们(在默认位置* 或通过将路径包含为标志)。

*我不知道 Windows 的默认位置。

于 2013-05-06T17:41:49.553 回答
1

我安装了 VS 2015 Express,它运行时说它是 VS 2017 社区,并且在非常简单的 c++ 程序中遇到了这个 altbase.h 问题。您可以专注于获取确切的包含文件,或者您可以退后一步来解决这个问题。Microsoft 是一家大而全面的公司,当他们为您提供 c++ 编译器时,他们会为您提供所需的库。当我解决这个问题时,我

  1. 以管理员身份启动 Visual Studio。
  2. 创建了一个 Win32 c++ 控制台应用程序
  3. 没有在 c++ 项目创建向导上检查“空项目”。
  4. 没有检查 ATL 和 MFC 的通用头文件。

然后,当我添加我的代码时,生成的 stdafx.h 默认包含的标头不会像以前那样导致这个 altbase.h 问题。我能够添加其他包含并做了一个“使用命名空间标准;” 我能够做 cout 和 cin 的。我的基本操作系统是 Windows 7 Home Premium。显然,当您安装 VS 2015/2017 Express 时,您必须选择 c++ 复选框进行安装。

于 2017-05-13T05:10:55.043 回答