The Windows headers declare two versions of most APIs that take string parameters or buffers which contain strings. These typically end in either W, for a version taking Unicode (word-oriented) strings, or A, for a version taking ANSI (byte-oriented) strings. Windows 9x, in the main, only supplies the ANSI versions; Windows NT and successors (2000, XP, 2003) supply both versions. So there are actually two functions in the API: MessageBoxA and MessageBoxW. For convenience the headers define a macro which, depending on whether UNICODE is defined, maps to the W or A version of the API. This allows Unicode and ANSI versions of the software to be compiled from the same sources just by defining or not defining UNICODE. So MessageBox is a macro defined to either MessageBoxW or MessageBoxA - the former if UNICODE is defined and the latter if not. The C++ macro processor is dumb. It doesn't understand that you're trying to call the Windows Forms MessageBox class's Show method. It just replaces the text with either MessageBoxW or MessageBoxA. This will give a compile error because there's no class with that name. I think the best thing for you to do is to isolate the .NET code in one set of source files, and the unmanaged code in another set. In the unmanaged set, include windows.h; in the managed files, don't. If it's in your precompiled header file, remove it. Stability. What an interesting concept. -- Chris Maunder