2012-09-17 49 views
2

我在Windows 7 x32上的C++ Builder XE3中安裝了當前穩定的JEDI代碼庫。它工作正常,但只有我不包含像JclFileUtils.hpp這樣的文件,其中包括JclWin32.hpp。然後,我總是得到編譯器錯誤E2040:「宣言終止錯誤」(文件JclWin32.hpp,線682,在下面的代碼段第二行):使用JclWin32.hpp時JEDI JCL運行時編譯器錯誤E2040

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

我既不是有一個想法是這個錯誤來自,也不能找到任何提示。可能是什麼原因?提前致謝。

回答

1

我得到了幫助,並解決了這個問題。只需更換靜態常量聲明:

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

與本宏定義:

#define CSIDL_PROGRAM_FILESX86 0x2a 
+0

這不是正確的解決方案。看到我的答案。 –

0

這是JclWin32.pas的錯誤。預處理器運行,並執行#define符號替換

#define CSIDL_PROGRAM_FILESX86 0x002a 

之後,編譯器最終看到:

在C/C++,Win32 API的使用預處理器#define語句,例如聲明在微軟的shlobj.hCSIDL值以下無效聲明中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>'}語句來引入C/C++項目使用的現有Win32 API聲明。

相關問題