2

我已经在 Windows 7 x32 上的 C++ Builder XE3 中安装了当前稳定的 JEDI 代码库。它工作正常,但只要我不包含 JclFileUtils.hpp 等包含JclWin32.hpp的文件。然后我总是得到编译器错误 E2040:“声明错误地终止”(在文件 JclWin32.hpp 中,第 682 行,以下代码片段的第二行):

#define NetApi32 L"netapi32.dll"
static const System::Int8 CSIDL_PROGRAM_FILESX86 = System::Int8(0x2a);
#define RT_MANIFEST (System::WideChar *)(0x18)

我不知道这个错误是从哪里来的,我也找不到任何提示。可能是什么原因?提前致谢。

4

2 回答 2

1

我得到了帮助和解决这个问题的方法。只需替换静态 const 声明:

static const System::Int8 CSIDL_PROGRAM_FILESX86 = System::Int8(0x2a);

使用此宏定义:

#define CSIDL_PROGRAM_FILESX86 0x2a
于 2012-09-18T13:14:34.483 回答
0

这是JclWin32.pas.

在 C/C++ 中,Win32 API使用预处理器语句CSIDL在 Microsoft 的标头中声明值,例如:shlobj.h#define

#define CSIDL_PROGRAM_FILESX86 0x002a

在预处理器运行并执行#define符号替换后,编译器最终会在 中看到以下无效声明JclWin32.hpp

static const System::Int8 0x002a = System::Int8(0x2a);

JCL 根本不应该重新声明CSIDL_PROGRAM_FILESX86(或任何其他CSIDL值)。它应该是:

  1. 使用 Delphi 自己的Winapi.ShlObj单元,该单元已经声明了CSIDL值。

  2. 如果不使用该Winapi.ShlObj单元,那么它至少应该声明其手动CSIDL值,{$EXTERNALSYM}以便它们不会出现在生成的JclWin32.hpp文件中。如果需要,JCL 可以包含一个{$HPPEMIT '#include <shlobj.h>'}语句来拉入现有的 Win32 API 声明以供 C/C++ 项目使用。

于 2017-03-27T17:32:33.780 回答