首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JclWin32.hpp时JCL运行时编译器错误E2040

使用JclWin32.hpp时JCL运行时编译器错误E2040
EN

Stack Overflow用户
提问于 2012-09-17 12:18:18
回答 2查看 302关注 0票数 2

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

代码语言:javascript
复制
#define NetApi32 L"netapi32.dll"
static const System::Int8 CSIDL_PROGRAM_FILESX86 = System::Int8(0x2a);
#define RT_MANIFEST (System::WideChar *)(0x18)

我既不知道这个错误是否来自于此,也没有找到任何提示。可能是什么原因?提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-18 13:14:34

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

代码语言:javascript
复制
static const System::Int8 CSIDL_PROGRAM_FILESX86 = System::Int8(0x2a);

有了这个宏定义:

代码语言:javascript
复制
#define CSIDL_PROGRAM_FILESX86 0x2a
票数 1
EN

Stack Overflow用户

发布于 2017-03-27 17:32:33

这是JclWin32.pas中的一个bug。

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

代码语言:javascript
复制
#define CSIDL_PROGRAM_FILESX86 0x002a

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

代码语言:javascript
复制
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++项目使用。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12459009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档