Search code examples
delphic++builderomnithreadlibrary

OmniThreadLibrary C++ builder Build issues


I'v been trying to get OmniThreadLibrary to run in builder, i've built it with all the c++ required files it builds ok but when i use it in an c++ builder app i get a bunch of error messages that look like the following

[bcc32 Error] DSiWin32.hpp(385): E2040 Declaration terminated incorrectly

one points at this line of code in the generated hpp file

static const System::Int8 CSIDL_ADMINTOOLS = System::Int8(0x30);

has anyone had this working in C++ builder or know the best way to resolve these issues

I'm using c++ builder settle and OmniThreadLibrary version 3.06


Solution

  • The Win32 API (and Delphi, for that matter) already declares CSIDL_ADMINTOOLS, Omni should not be declaring it at all. It should be using Delphi's Shlobj unit instead.

    The Win32 API declares CSIDL_ADMINTOOLS using a #define statement:

    #define CSIDL_ADMINTOOLS 0x0030
    

    So the declaration in Omni's .hpp is getting modified by the C++ preprocessor to this:

    static const System::Int8 0x0030 = System::Int8(0x30);
    

    Thus the "Declaration terminated incorrectly" compiler error.

    When Delphi code declares something that already exists in C++, it needs to be declared as either {$EXTERNALSYM} or {$NODECLARE} to avoid duplicate declarations, and then optionally use {$HPPEMIT} to output a relevant #include statement in a generated .hpp file. Delphi's units already do that for its Win32 declarations.

    If Omni is not already doing that (and the error would suggest it is not) then it needs to be updated accordingly.