You probably don't need FALSE since type bool is part of C++ and includes the constants true and false.
COMPRESS_MAX_COM would be better as a const int: constint COMPRESS_MAX_COM = 0x70000000;
COMPRESS_MAX_ORG and MAX_RAW_GROUP should probably be const int also, assuming that COMPRESS_OVERRUN and MAX_RAW_ITEM are both consts.
U(X) could be done as a templated function. This would remove the nasty bug of something like U(18+2.2) which expands to ((ULONG)18+2.2) which is a double with value 20.2. If you do this as a macro, it should be #define U(X) ((ULONG)(X))
I think a good general rule is: macros should be used to select code, not to generate it.
To generate code use templates.
By selecting code I mean of course using conditionals and symbols that only act as flags to the preprocessor and have no real inpact in your code. This keeps things uniform (or at least as uniform as they can be in C++).