The Old New Thing

Practical development throughout the evolution of Windows.

Latest posts

Dec 23, 2010
Post comments count 0
Post likes count 1

What is the correct way of temporarily changing a thread's preferred UI language?

Raymond Chen

A customer ran into a crashing bug in their shell extension. The shell extension wants to change the thread's preferred UI language temporarily, so that it can load its resources from a specific language. You'd think this would be easy: Approximately ten seconds after this code runs, Explorer crashes with the exception whose description is "A threadpool worker thread enter a callback, which left with preferred languages set. This is unexpected, indicating that the callback missed clearing them." (Just before Explorer crashes, the message "ThreadPool: callback 77180274(05B67430) returned with preferred langua...

Dec 22, 2010
Post comments count 0
Post likes count 2

The __fortran calling convention isn't the calling convention used by FORTRAN

Raymond Chen

Although the Microsoft C compiler supports a calling convention called , that's just what the calling convention is called; its relationship with the FORTRAN programming language is only coincidental. The keyword is now just an old-fashioned synonym for . Various FORTRAN compilers use different calling conventions; the one I describe here applies to the now-defunct Microsoft Fortran PowerStation. Fortran Powerstation pushes parameters on the stack right-to-left, with callee-cleanup. (So far, this matches aka .) Function names are converted to all-uppercase, with an underscore at the beginning and appende...

Dec 21, 2010
Post comments count 0
Post likes count 1

How do I simulate input without SendInput?

Raymond Chen

Michal Zygmunt wants to create a system where multiple applications can have focus, with different users generating input and directing them at their target applications. Attempting to simulate this by posting input messages didn't work. "Can you tell us maybe how SendInput is internally implemented so that we can use it to simulate only part of the actions (like without acquiring focus)?" operates at the bottom level of the input stack. It is just a backdoor into the same input mechanism that the keyboard and mouse drivers use to tell the window manager that the user has generated input. The function doesn...

Dec 20, 2010
Post comments count 0
Post likes count 1

Developing the method for taking advantage of the fact that the OVERLAPPED associated with asynchronous I/O is passed by address

Raymond Chen

You can take advantage of the fact that the associated with asynchronous I/O is passed by address, but there was some confusion about how this technique could "work" when kernel mode has no idea that you are playing this trick. Whether kernel mode is in on the trick is immaterial since it is not part of the trick. Let's start with a version of the code which does not take advantage of the structure address in the way described in the article. This is a technique I found in a book on advanced Windows programming: This version of the code uses the address of the structure to determine the location in th...

Dec 20, 2010
Post comments count 0
Post likes count 1

What happened to the return code from WinMain in 16-bit Windows?

Raymond Chen

Commenter S asks, "What happened to the return code from WinMain in a Windows 3.1 app?" After all, there was no function in 16-bit Windows. Basically, the exit code vanished into the ether. Unless you captured it. The Toolhelp library provided a low-level hook into various parts of the kernel, allowing you to monitor, among other things, the creation and destruction of tasks. That was how you captured the return code of a Windows program in 16-bit Windows. But if you didn't catch it as it happened, it was gone forever, lost in the ether.

Dec 17, 2010
Post comments count 0
Post likes count 2

The OVERLAPPED associated with asynchronous I/O is passed by address, and you can take advantage of that

Raymond Chen

When you issue asynchronous I/O, the completion function or the I/O completion port receives, among other things, a pointer to the structure that the I/O was originally issued against. And that is your key to golden riches. If you need to associate information with the I/O operation, there's no obvious place to put it, so some people end up doing things like maintaining a master table which records all outstanding overlapped I/O as well as the additional information associated with that I/O. When each I/O completes, they look up the I/O in the master table to locate that additional information. But it's eas...

Dec 16, 2010
Post comments count 0
Post likes count 1

Why does SHCOLUMNINFO have unusually tight packing?

Raymond Chen

Alternate title: News flash: Sometimes things happen by mistake rbirkby asks why the structure has 1-byte packing. "Was the expectation that there would be so many columns in a details view that the saving would be worthwhile?" Hardly anything that clever or ingenious. It's just the consequence of a mistake. When the structure was added to the header file in the Windows 2000 timeframe, it was added with no specific packing directive. But it turns out that there was a specific packing directive; it just wasn't obvious. Near the top of the header file was the following: (There was of course a mat...

Dec 15, 2010
Post comments count 0
Post likes count 1

There is no interface for preventing your notification icon from being hidden

Raymond Chen

Yes, it's another installment of I bet somebody got a really nice bonus for that feature. A customer had this question for the Windows 7 team: Our program creates a notification icon, and we found that on Windows 7 it is hidden. It appears properly on all previous versions of Windows. What is the API to make our icon visible? First of all, I'd like to congratulate you on writing the most awesome program in the history of the universe. Unfortunately, Windows 7 was not prepared for your awesomeness, because there is no way to prevent your notification icon from being hidden. That's because if t...

Dec 14, 2010
Post comments count 0
Post likes count 0

The subtleties of a Will Ferrell movie, and other observations from the in-flight entertainment on a Chinese airline

Raymond Chen

My flights to and from Beijing were on Hainan Airlines, a Chinese airline. One consequence of this is that Mandarin Chinese is the primary language of communication; English is a distant second. It also means that the in-flight movies are subtitled in Chinese, so if you can't read Chinese, you are restricted to movies in languages you understand. I wasn't interested in the English-language movies, although I did watch a little bit of "The Other Guys", a Will Ferrell vehicle. In one scene, Ferrell's character and his friend have dinner in a Chinese restaurant. Ferrell's character says to the waiter, "謝&#35...