Everything2
Near Matches
Ignore Exact
Full Text
Everything2

windows.h

created by wharfinger

(thing) by wharfinger (6.4 y) (print)   ?   (I like it!) 1 C! Thu Jan 18 2001 at 4:44:08

windows.h is a C language header file provided by the good folks at Microsoft. It describes itself in a comment as the "Master include file for Windows applications." Fair enough: That's what it is.

It's mostly a laundry list of #includes; as far as I can recall (NB: I didn't recall far enough; JayBonci mentions commctrl.h below, and it's not the only one), there aren't any other Windows header files that you need to #include separately1. windows.h includes everything. Sure, that's excessive; we'll get to that in a few paragraphs.

There are a few #defines:

  • _WINDOWS_ is defined with no value; #if defined_WINDOWS_ ), why then I guess that's where you are.

  • WINVER is the presumed version of Windows; it's a hex number where the third-from-lowest digit is the major version, and the other digits are, I suppose, increasingly minor versions or something. Win32's been using 0x0400 for years now, and I don't have any old 16-bit windows compilers right on hand to compare with.

  • _INC_WINDOWS: Damned if I know. It's undocumented.

  • _MIPS_, _ALPHA_, _PPC_: Ha ha. When NT4 was first released, it was supported on all of those processors in addition to x86. They started abandoning them, one by one, after a year or two; Alpha was the last to go. But the evidence lives on in the header file.

If you're annoyed by the promiscuous inclusiveness of the thing, you can #define WIN32_LEAN_AND_MEAN and it'll skip over a bunch of #includes, like for example shellapi.h and the ever-crucial dde.h (remember DDE? They're still supporting it . . . (NB: As JayBonci suggests, that is not a bad thing)) There's also a list of about forty "flags" that you can #define so as to exclude more specific sets of functions and/or #defines: NOKANJI, NOVIRTUALKEYCODES, etc. etc.

This is the Windows "philosophy", I suppose: Default to a blizzard of crap, and let more sophisticated users whittle away the unwanted excess. There is a bit of a contrast with standard C and C++ header files, where if you want something you'll need to go looking for it. stdlib.h has a lot of stuff in it, but it's hardly all-inclusive.



1You may run into problems in a weird environment. For example, Borland C++ Builder includes windows.h via its own headers, but it manages not to #include shellapi.h. It may be that they #define WIN32_LEAN_AND_MEAN, or that they include everything piecemeal. I've got the compiler right here, but that's another writeup.

(thing) by schwa (2 y) (print)   ?   (I like it!) Thu Jan 18 2001 at 4:52:56

"windows.h is a C language header file provided by the good folks at Microsoft."

This is most odd because on my machine doing a #include "Windows.h" brings in the header file that allows me to get to all the juicy toolbox functions in Window Manager.

Aha! No it doesn't any more. All that juiciness is in "MacWindows.h" and "Windows.h" just includes that file instead. Guess all those poor people doing dual Windows/Macintosh development were getting confused. Poor luvs.


(thing) by illusionist (8.2 mon) (print)   ?   (I like it!) 1 C! Thu Jan 18 2001 at 5:25:18

Windows.h, which is freely available through the Microsoft Platform SDK, is, as wharfinger mentioned, the catch-all windows include file. It is this way to preserve backwards compatibility. Of course things like DDE and OLE are still supported, as Windows has a legacy (whether you like it or not), of NOT breaking older programs unless one absolutely has to. Thus there are piles of software already working

Windows programs used to, in theory, cross-compile (this was in VS 5, through something known as WLM, the Windows Layer for the Macintosh). This is evident in the files with #ifndef MAC and the like. The Windows NT 4 HAL was available in four flavors, and thus you had to account for them, for developers (Alpha had API emulation and could run a good deal of x86 binaries). Now you can see that all of the IA 64 stuff is included with that. That is obviously to get ready for the next generation of programs for Intel's new server hardware.

Basically windows.h gives you the four big header files:
  • windef.h - All of your definition files. It's for backwards compatability and maintainability.
  • winbase.h - All of your api's are defined in here
  • wingdi.h - GDI, it's your friend.
  • winuser.h - USER definitions and such (Things related to user input, hooks, etc)


Without those four, there's no way you could assemble an app. Small defines like DDE and the like don't matter if you don't link against them, and the compiler does a good job to get rid of the things that you don't need there.

To answer a few questions:
  • _WINDOWS_ and _INC_WINDOWS are there so you can kill redifinition warnings and the like. It's so that you don't end up including files in a loop, and so that you don't have to worry about it. It's a common trick in any API index (check up on Mac OS API files in the carbon SDK or what not, you'll see similar practices).
  • WINVER is defined so that certain APIs are available when you "target" certain platforms. For winstance WINVER as 0x0500 is Windows 2000 (NT 5). WINVER 0x0400 is Windows 95 and NT 4.0. WINVER 0x0410 is Windows 98 (and NT 4.0 again). You can also define what version of IE is in there (IE is important if you want the IE browser COM object, or if you want any of the updated common control libraries). Check MSDN for more info on how that actually works, it's a lot to write here.
  • As far as Borland is concerned, MS makes a fairly decent effort to try and support their compiler. There are special libraries and such for Direct X, for instance. Otherwise, just stick with what the third party vendor came up with.
  • The Windows "philosophy" isn't really default to a "pile of crap", but give the developer the most amount of flexibility in creating an application, without having to muck with your header files. Give them the ability to shut things off as necessary, and to tinker without having to change header files.


Windows.h does not include other things that your app might need, like common controls in . These are to be added, and linked against so that your app can have them available (don't forget to register the classes with InitCommonControls()! ). As with anything, it takes some learning, but Microsoft is really good with it's third party developers and tries to make their lives as easy as possible.


printable version
chaos

DDE Painful User Interface How to create a bitmap in memory in Windows .h
file descriptor C++ Builder #if Programming
Microsoft Windows Microsoft Nb How to create a Window in Windows
GDI C Windows Windows on a Macintosh
header file string.h Ole Win32 system tray icon
stdlib.h Collision detection for a first-person shooter stdio.h The Mountains of Mourne
Y'know, if you log in, you can write something here, or contact authors directly on the site. Create a New User if you don't already have an account.
  Epicenter
Login
Password

password reminder
register

Everything2 Help

Cool Staff Picks
Little presents from the Node Fairy:
Fred Rogers
People shouldn't swallow rocks
Nate on the Voting/Experience System
Rome
Cashmere
Howlin' Wolf
Los Alamos National Laboratory
Barbed wire
The Guru got a girlfriend
Chili
analytic/synthetic distinction
Aqua Teen Hunger Force
Welcome to the Involuntary Agnostics Association
New Writeups
SubSane
Making Love to a 9-Foot Woman(person)
Ouzo
Thoughts(idea)
antigravpussy
I fall silent, listening. The breadcrumbs are talking about us(person)
calgon
Buffalo Bill by the pool(poetry)
gate
Anarchy is Order(idea)
ushdfgakjasgh
Scribeling(thing)
XWiz
Trism(review)
artman2003
Briefcase Full of Souls - Part I(fiction)
Dreamvirus
Alan Ladd(person)
waverider37
Harold Holt(person)
The Debutante
Until death do us part(fiction)
Ysardo
a brother to a sister(personal)
antigravpussy
your warm whispers(personal)
Clarke
Multiculturalism(idea)
aneurin
Earl of Landaff(person)
This page courtesy of The Everything Development Company