Showing results for Code - The Old New Thing

Dec 31, 2004
Post comments count0
Post likes count0

Using fibers to simplify enumerators, part 3: Having it both ways

Raymond Chen
Raymond Chen

As we discovered in the previous two entries [second], the problem with enumeration is that somebody always loses. Now we will use fibers to fight back. Before you decide to use fibers in your programs, make sure to read the dire warnings at the end of this article. My goal here is to show one use of fibers, not to say that fibers are the answer ...

Code
Dec 30, 2004
Post comments count0
Post likes count0

Using fibers to simplify enumerators, part 2: When life is easier for the caller

Raymond Chen
Raymond Chen

Last time, we looked at how a directory tree enumerator function would have been written if the person writing the enumerator (the producer) got to write the spec. Now let's look at what it would look like if the person consuming the enumerator wrote the spec: #include <windows.h> #include <shlwapi.h> #include <stdio.h> #includ...

Code
Dec 29, 2004
Post comments count0
Post likes count0

Using fibers to simplify enumerators, part 1: When life is easier for the enumerator

Raymond Chen
Raymond Chen

The COM model for enumeration (enumeration objects) is biased towards making life easy for the consumer and hard for the producer. The enumeration object (producer) needs to be structured as a state machine, which can be quite onerous for complicated enumerators, for example, tree walking or composite enumeration. On the other hand, the callback...

Code
Dec 24, 2004
Post comments count0
Post likes count0

Why does the system convert TEMP to a short file name?

Raymond Chen
Raymond Chen

When you set environment variables with the System control panel, the and variables are silently converted to their short file name equivalents (if possible). Why is that? For compatibility, of course. It is very common for batch files to assume that the paths referred to by the and environment variables do not contain any embedded space...

Code
Dec 23, 2004
Post comments count0
Post likes count0

Do you need clean up one-shot timers?

Raymond Chen
Raymond Chen

The CreateTimerQueueTimer function allows you to create one-shot timers by passing the WT_EXECUTEONLYONCE flag. The documentation says that you need to call the DeleteTimerQueueTimer function when you no longer need the timer. Why do you need to clean up one-shot timers? To answer this, I would like to introduce you to one of my favorite rhe...

Code
Dec 22, 2004
Post comments count0
Post likes count1

BOOL vs. VARIANT_BOOL vs. BOOLEAN vs. bool

Raymond Chen
Raymond Chen

Still more ways of saying the same thing. Why so many? Because each was invented by different people at different times to solve different problems. BOOL is the oldest one. Its definition is simply typedef int BOOL; The C programming language uses "int" as its boolean type, and Windows 1.0 was written back when C was the cool languag...

Code
Dec 10, 2004
Post comments count0
Post likes count0

Dragging a shell object, part 5: Making somebody else do the heavy lifting

Raymond Chen
Raymond Chen

Creating that drag image was a bit of work. Fortunately, the listview control is willing to do some of the work for you. Throw away the OnLButtonDown function (and the HANDLE_MESSAGE that goes with it). Instead, we'll make the listview do all our presentation for us. BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpcs) { g_hwndChild = CreateWindow(...

Code
Dec 9, 2004
Post comments count0
Post likes count0

Dragging a shell object, part 4: Adding a prettier drag icon

Raymond Chen
Raymond Chen

You may have noticed that the drag feedback is rather sad-looking. Just a box, maybe with a plus sign or an arrow; you don't even know what it is you're dragging. Let's fix that. We'll drag the icon of the file around. We'll need to add the drag image to the data object. void OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyF...

Code
Dec 8, 2004
Post comments count0
Post likes count0

Dragging a shell object, part 3: Detecting an optimized move

Raymond Chen
Raymond Chen

We were considering how to detect that the drag/drop operation resulted in a conceptual Move even if the DROPEFFECT_MOVE was optimized away. If the drop target is the shell, you can query the data object for CFSTR_PERFORMEDDROPEFFECT to see what the performed effect was. void OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x...

Code