Welcome to MSDN Blogs Sign in | Join | Help

The 2010/2011 Seattle Symphony subscription season at a glance

Every year, I put together a little pocket guide to the Seattle Symphony subscription season for my symphony friends to help them decide which ticket package they want. As before, you might find it helpful, you might not, but either way, you're going to have to suffer through it. Here's the at-a-glance season guide for Gerard Schwarz's final season as the orchestra's music director.

Week Program Comments 18 12 9A 9B 6AB 6CD 6EF 6G 4B BB MM RA RB BS SS
09/23
2010
Foote: Francesca da Rimini
Brahms: Symphony #3
Prokofiev: Piano Concerto #2
Okay?
Awesome
Good
                             
09/30
2010
Debussy: Pelléas et Mélisande Suite
Kernis: Air
Bloch: Baal Shem
Dvořák: Symphony #7
Okay
Good?
Nervous?
Excellent
                     


 
     
10/07
2010
Copland: Appalachian Spring Suite
Gershwin: Rhapsody in Blue
Ravel: Concerto for Left Hand
Stravinsky: Symphony in Three Movements
Excellent
Awesome
Excellent
Okay
                             
10/15
2010
Bach: Orchestral Suite #1, BWV 1066
Handel (arr. Schwarz): Concerto Grosso Op 6 No 9
Bach: Brandenburg Concerto #1
Handel: Water Music Suite #2
Excellent
Awesome
Excellent
Awesome
                             
10/23
2010
Gabrieli: Due Canzoni
Bach: Toccata and Fugue in D minor, BWV 565
Handel: Organ Concerto The Cuckoo and the Nightingale
Widor: Symphony #6 Allegro, Op 42 No 2
Hanson: Concerto for Organ and Harp
Poulenc: Organ Concerto in G minor
Excellent?
Awesome
Good?
Good?
Wildcard
Nervous
                             
10/28
2010
Mozart: Symphony #33, K319
Copland: Clarinet Concerto
Schnittke: Moz-Art à la Haydn
Haydn: Symphony #45 Farewell
Awesome
Nervous
Nervous
Excellent
                             
10/31 Debussy: La Mer (lecture-concert) Excellent                              
11/04
2010
Yannatos: Ritual Images
Debussy: La Mer
Beethoven: Piano Concerto #5, Emperor
Nervous
Excellent
Awesome
                             
11/11
2010
Liszt: Mephisto Waltz #1
Prokofiev: Symphony #3
Tchaikovsky: Piano Concerto #1
Awesome
Okay
Awesome
                     
 

     
11/18
2010
Rossini: Overture to Semiramide
Glass: Violin Concerto
Bizet: Symphony #1
Ravel: Boléro
Awesome
Nervous
Excellent
Awesome
                             
12/09
2010
Roussel: Bacchus et Ariane Suite #2
Lieberson: Neruda Songs
Prokofiev: Romeo and Juliet Excerpts
Good?
Nervous
Excellent
                     
 

 
     
01/06
2011
Sheng: Shanghai Overture
Bartók: Violin Concerto #2
Borodin: Symphony #1
Nervous
Nervous
Excellent
                             
01/20
2011
Mozart: Symphony #28, K189K [200]
Mozart: Horn Concerto #2, K417
Mozart: Requiem, K626
Excellent
Excellent
Excellent
                             
01/27 Operatic highlights: Dramatic moments Excellent            
 
               
01/29 Operatic highlights: Comedic moments Excellent            
 
               
02/03
2011
Berlioz: Overture to Benvenutto Cellini
Lalo: Symphonie espagnole
Bruckner: Symphony #6
Good
Awesome
Nervous
                             
02/10
2011
Debussy: Prélude à l'aprèes-midi d'un faune
Messiaen: Oiseaux exotiques
Mozart: Rondo for Piano in D, K382
Brahms: Symphony #4
Excellent
Nervous
Awesome
Awesome
   
 


 
                 
 


 
   
02/17
2011
Telemann: Viola Concerto in G, TWV 51:G9
Brahms: Serenade #2
Berlioz: Harold in Italy
Good?
Excellent
Good
                             
02/27 Vivaldi: Four Seasons (lecture-concert) Awesome                              
03/11
2011
Graun: Overture and Tra le procelle assorto from Cleopatra e Cesare
Hasse: Morte, col fiero aspetto from Marc'Antonio e Cleopatra
Handel: Water Music Suite #1
Handel: Overture and Piangerò la sorte mia from Guilio Cesare
Handel: Concerto Grosso in G, Op 6 No 1
Matheson: The Death of Cleopatra from Cleopatra
Excellent?
Excellent?
Awesome
Good?
Excellent
Wildcard
                             
03/17
2011
Borodin: Polovtsian Dances
Khachaturian: Violin Concerto
Shostakovich: Symphony #5
Excellent
Okay?
Excellent
   
 

 
                 
 

 
   
03/24
2011
Hovhaness: Symphony #7, Nanga Parvat
Hovhaness: Prelude and Quadruple Fugue
Hovhaness: Symphony #2, Mysterious Mountain
Dvořák: Cello Concerto
Nervous
Nervous
Nervous
Awesome
 



     
 



                   
03/26
2011
Hovhaness: Symphony #14, Ararat
Hovhaness: Symphony #50, Mount St. Helens
Elgar: Cello Concerto
Nervous
Nervous
Excellent
 


     
 


                   
03/31
2011
Brahms: Schicksalslied
R. Strauss: Also sprach Zarathustra
Saint-Saëens: Symphony #3, Organ
Excellent
Polarizing
Awesome
                             
04/07
2011
Ravel: Ma Mère L'Oye Suite
Prokofiev: Violin Concerto #1
Rachmaninov: Symphony #3
Awesome
Polarizing
Good
   
 

 
                 
 

 
   
04/21
2011
McTee: Double Play
Gershwin: Concerto in F
Tchaikovsky: Symphony #5
Wildcard
Awesome
Awesome
                             
04/28
2011
Sibelius: Symphony #7
Britten: Violin Concerto #1
Bartók: Concerto for Orchestra
Good
Nervous
Excellent
                             
05/05
2011
Martinů: Toccata e due canzoni
Shostakovich: Piano Concerto #1
Honegger: Pastorale d'été
Haydn: Symphony #60, Il distratto
Nervous
Good
Excellent?
Excellent
                             
05/13
2011
CPE Bach: Symphony for String Orch. in G, Wq 183/4
CPE Bach: Double Harpsichord Concerto in F, Wq 47
CPE Bach: Symphony for String Orch. in D, Wq 183/1
Bach: Sinfonia from Cantata 42 Am Abend aber desselbigen Sabbats
Telemann: Tafelmusik III Suite and Conclusion
Awesome
Good?
Excellent
Good?
Good?
                             
05/19
2011
Mendelssohn: The Hebrides
Mozart: Violin Concerto #4, K218
Beethoven: Symphony #8
Excellent
Excellent
Excellent
                             
05/22 Dvořák: Symphony #9 (lecture-concert) Awesome                              
06/02
2011
Jones: Symphonic Poem
Liszt: Piano Concerto #2
Shostakovich: Symphony #10
Wildcard
Excellent
Nervous
                             
06/16
2011§
Schubert: Symphony #8, Unfinished
Mahler: Symphony #2, Resurrection
Awesome
Polarizing
                             
      18 12 9A 9B 6AB 6CD 6EF 6G 4B BB MM RA RB BS SS
† Premiere
§ Schwarz farewell concert
18 Masterworks 18AB
12 Masterworks 12AB
9A Masterworks 9A
9B Masterworks 9B
6AB Masterworks 6AB
6CD Masterworks 6CD
6EF Masterworks 6EF
6G Masterworks 6G
4B Masterworks 4B
BB Baroque
MM Mainly Mozart
RA Rush Hour A
RB Rush Hour B
BS Beyond the Score
SS Symphony Specials

For those not familiar with the Seattle Symphony ticket package line-ups: Most of the ticket packages are named Masterworks nX where the number is the number of concerts in the package, and the letter indicates which variation. Ticket packages which are identical (or near-identical) have been combined. For example, 6C and 6D are the same concerts; the only difference is that 6C is for Thursday nights, while 6D is for Saturday nights. Split boxes are used for concert differences between near-identical series. (For example, the 18A series gets the Dvořák Cello Concerto whereas the 18B series gets the Elgar.) Some concerts (such as the Rush Hour series) are reduced-program; partially-filled boxes show which works are included.

Changes from last season:

  • The Masterworks 18 series has two bonus concerts (for a total of 20), down from four bonus concerts last yet. (The 12, 9, and 6 series each have one bonus concert; same as last year.)
  • Discontinued series: 4A.
  • The Popular Classics series became the Rush Hour series (and there are now two of them).
  • The Musically Speaking series became the Beyond the Score series and has become a "one-off" series.
  • The Basically Baroque Series has been renamed the Baroque and Northwest Wine Series. (Tastings take place before the concerts.) It too has become a "one-off" series.

This chart doesn't include "one-off" concert series such as the Visiting Orchestras or Distinguished Artists series. A "one-off" series is a concert series which shares no concerts with any other series. (Beyond the Score and Baroque and Northwest Wine are grandfathered in; I'll probably omit them in future years.)

The comments column very crudely categorizes the works to assist my less-classically-aware friends. This is, of course, a highly subjective rating system, but I tried to view each piece from the ears of my symphony friends. Thus, I rated downward pieces that I personally like but which others might not and rated up pieces that I may not find musically satisfying but which nevertheless tend to be crowd-pleasers.

These predictions have, of course, proven wrong in the past. Though I finally overcame my Bruckner jinx, and my symphony friends actually liked the Bruckner Fourth, except for the fact that it went on too long. One of my friends described it as "It's like a conversation that starts out really nice, but then it starts to drag on and get repetitive, and they just won't shut up." (How was I to know that Masur would not only use the Hass revision, but also take all the repeats? The work is already too long at 60 minutes; the right thing to do is to cut 20 minutes of it, not to add another 20!)

Here's what the comments mean. Note that they do not indicate whether the piece is significant in a musicological sense; they're just my guess as to whether my friends are going to like it. (For example, I know that my friends hate minimalism, so I rated the Glass down even though I myself would enjoy it.)

  • Awesome: Guaranteed crowd-pleaser.
  • Excellent: You will definitely like this piece.
  • Good: You will probably like this piece.
  • Okay: You may like this piece.
  • Nervous: I have a bad feeling about this one.
  • Polarizing: Some people will love it; others will hate it.
  • Wildcard: I have no idea what will happen.

In many cases, I am not familiar with the piece and am basing my evaluation on what I know about the composer (or am just guessing).

Posted by oldnewthing | 9 Comments
Filed under:

For better performance, set all your monitors to the same color format

Pplu wonders why programs run more slowly when the system is running with multiple monitors.

Well, for one thing, of course, when you have more than one monitor, there's more stuff on the screen for the system to keep track of. It's the same reason that programs run more slowly on a large monitor than on a small monitor.

And if there's only one monitor, then functions like MonitorFromPoint become trivial if the flag is something like MONITOR_DEFAULTTONEAREST, because when there's only one monitor, answering questions like "What monitor is closest to this point"? becomes very easy.

If your two monitors are not the same dimensions, then the union of the two monitors will not be rectangular, which makes clipping against the union of all monitors more complicated.

But I suspect the big penalty for multiple monitors kicks in if you make the mistake of setting your monitors to different color formats, for example, if you set one monitor to 565 format and set another to 24bpp.

If the two monitors do not use the same color format, then programs will be forced to use DIBs instead of DDBs for screen bitmaps, in case a window is moved to a window with a different color format (or worse, is positioned so it straddles two monitors with different color formats). In principle, programs need only use the "worst-case" DIB; for example, if one monitor is 555 and the other is 565, then a 565 DIB will suffice. In practice, however, most programs just fall back to a 24bpp or 32bpp DIB when faced with monitors with different color formats.

(You query whether all monitors have the same color format by calling GetSystemMetrics(SM_SAMEDISPLAYFORMAT).)

Since a format conversion takes place when a DIB is blitted to a device with a different color format, forcing a program to retain its bitmaps as DIBs means that for at least one of the monitors (and probably both), you're going to undergo a format conversion when that DIB is drawn to the screen. There are also a few miscellaneous optimizations which are disabled when not all your monitors use the same color format because the cost of using DIBs outweighs the savings from the optimization.

So if you haven't already, go into your display settings and check that you set all your monitors to the same color depth. If you don't do this, then a large class of graphics optimizations is lost.

Posted by oldnewthing | 12 Comments
Filed under:

Why doesn't my program receive the WM_DWMSENDICONICTHUMBNAIL message when I ask for an iconic representation?

A customer was having trouble adding Windows 7 taskbar integration features to their application:

I'm trying to use the new Windows 7 taskbar integration features, but am running into a problem. I've made certain that my program has the DWMWA_FORCE_ICONIC_REPRESENTATION and DWMWA_HAS_ICONIC_BUTMAP DWMWA_HAS_ICONIC_BITMAP [corrected 8am] attributes set, yet I never receive a WM_DWMSENDICONICTHUMBNAIL message in my window procedure.

A member of the taskbar team invoked psychic powers:

Is your program running elevated by any chance? If so, then you need to add the WM_DWMSENDICONICTHUMBNAIL message to your UIPI message filter:

ChangeWindowMessageFilter(WM_DWMSENDICONICTHUMBNAIL, MSGFLT_ADD);

Psychic powers once again save the day.

That was it. Thanks!

Note that forcing someone to invoke psychic powers is a bad thing. It means that you withheld crucial information that somebody had to guess at. Here are some crucial pieces of information people tend to forget to mention:

  • "Oh, did I mention that my process is running elevated?"
  • "Oh, did I mention that my process is a service?"
  • "Oh, did I mention that my process is 32-bit, running on a 64-bit machine?"
  • "Oh, did I mention that I initialized COM as MTA?"
  • "Oh, did I mention that my process is impersonating another user?"
  • "Oh, did I mention that I'm running a version of the operating system different from Windows 7?" (or whatever the most current client operating system is)

Added: The reason those items above are crucial pieces of information is that all of them (except the last one) are "game-changers": If you do any of the things in the list, a whole bunch of rules change. It's like asking a question about traffic regulations and neglecting to mention that the other vehicle is a fire truck with its siren on. (And presumably when you chose to invoke any of those game-changing conditions, you were aware of the rules which applied to the new situation. Those rules are documented with the game-changing condition, not with the general description of a normally-functioning universe. Imagine if every physics book had the sentence "This rule does not apply to Superman" at the end of every paragraph.)

Posted by oldnewthing | 32 Comments
Filed under:

The Brits once again come up with a clever solution to the problem of the scatterbrained client

My friend :: Wendy :: got into a state where she kept misplacing her passport. (I guess she keeps moving it around.) The first time she misplaced her passport and gave up looking for it, she reported it missing and received a replacement. Then she misplaced the replacement, and while searching for it, she found the original. She reported the first passport as found; this keeps the issuing government happy since they can take it off their If Somebody Tries To Use a Passport with This Number, Arrest Her list. But they can't reactivate the original passport, because it takes time for the updated list to propagate all around the world, and it would be bad to be travelling through some remote country and find yourself thrown in prison because they didn't get the word that your passport number has been un-revoked.

Anyway, she gave up looking for the second passport, and applied for another replacement. By this point, the government found itself in a bit of a quandary: Here's a citizen who is legally entitled to a passport but who has also demonstrated a bit of scatterbrainedness. Their solution: Issue a one-year passport. This allows them to fulfill their obligation to their citizens while limiting the damage if the passport is lost yet again.

(Believe it or not, that's the short version of the story. Here's the long version.)

Posted by oldnewthing | 10 Comments
Filed under:

Why doesn't the shell animation control tell me the dimensions of the animation it is displaying?

As we saw some time ago, the shell animation control suffers from many limitations because its job is to be a scaled-down animation control instead of one of its more full-featured counterparts.

One customer wanted to know how to load an animation into the shell animation control and then query its dimensions. Well, there is no message that reveals the dimensions of the animation. Why not? Because you should already know.

You can't use the shell animation control a general-purpose animation control because of those pesky limitations. You can only use animations that you yourself authored to conform to the control's rather stringent requirements. And since you authored those animations yourself, you already know what their dimensions are.

If you don't know the dimensions of the animation you're putting into the shell animation control, then how do you know that it meets all the other criteria either? In other words, to know that the animation is suitable for the shell animation control you already had to know far more about the animation than its dimensions.

Remember that the shell animation control supported only what the shell needed it to do when it was introduced in Windows 95. The shell team then figured, "Well, we wrote it, we may as well document it for others to use." Of course, no good deed goes unpunished, because this gift has turned into a liability: Even though Explorer stopped using the shell animation control years ago, the code for the control must remain in the product because it was documented to the public, and along with the code come all the support burdens.

Posted by oldnewthing | 11 Comments
Filed under:

Long-term temporary parking?

On my way to work, I saw a Notice of Proposed Land Use Action. The proposed new use for the property was listed as long-term temporary parking.

What the heck is long-term temporary parking?

Posted by oldnewthing | 21 Comments
Filed under:

What is the maximum length of an environment variable?

A customer noticed that environment variables were being truncated at 2047 characters and wanted to know what the maximum length of an environment variable is.

This is one of those cases where you can answer the customer's question or you can try to answer the question the customer is really asking. If you just answer the question, you're doing the customer a disservice.

The theoretical maximum length of an environment variable is around 32,760 characters. However, you are unlikely to attain that theoretical maximum in practice.

All environment variables must live together in a single environment block, which itself has a limit of 32767 characters. But that count is the sum over all environment variable names and values, so you could, I guess, hit that theoretical maximum length if you deleted all the environment variables and then set a single variable called X with that really huge 32,760-character value. In practice, of course, you have to share the environment block with all the other variables in the block, so your random call to SetEnvironmentVariable with a 32,760-character string is unlikely to succeed.

But that's not your only practical limit.

It also depends on how you're setting the variable; i.e., the code that your environment-variable-setting technique passes through before it gets to the SetEnvironmentVariable call. If you're using a batch file, then you're constrained by the maximum command line length since the environment variable needs to fit into the command line buffer of the batch processor. On the other hand, maybe you're setting the Environment registry key, in which case you run into a 2048-character limit in the code that parses that registry key and builds an environment block out of it. There's also a limitation in the dialog box for interactively setting environment variables, the numeric value of which I don't happen to know off the top of my head.

This is one of those skills you have to develop when answering questions from customers: Taking the customer's question and trying to figure out what their real question is.

Posted by oldnewthing | 25 Comments
Filed under:

It appears that car park computers revert to their native language, German, when placed under stress

A car park in Birmingham switches from English to German in times of stress.

That reminded me that over a decade ago, a colleague of mine noticed an error message on the screen at the exit to the parking garage at the Seattle-Tacoma International Airport. The way the airport works, you pick up a ticket as you enter, and you pay your parking fee at vending machines stationed around the parking garage, and at the exit, you insert the (paid) ticket into the machine, which verifies that you paid your parking fee and opens the gate.

When my colleague pulled up to the machine, instead of displaying the expected Please insert ticket message, it had an error message. In German.

Fortunately, my colleague knows German, and he recognized the error message as a Windows 95 serial port conflict resolution dialog. While he was trying to figure out how to click Abbrechen on a machine with no mouse or keyboard, an attendant walked up, took his ticket, and opened the gate.

Just another example which demonstrates that parking garage computers are native speakers of German, and they revert to it when placed in stressful situations.

Posted by oldnewthing | 25 Comments
Filed under:

Microspeak: Future-proofing

It has been famously said that England and the United States are two countries separated by a common language. The same holds true for Microspeak.

In the Redmond dialect of Microspeak, we talk about extensibility: Designing a system with specific points where features can be added in the future, often by outside parties. For example, an example of an extensibility point in the shell would be a context menu handler or a namespace extension.

In the Reading dialect of Microspeak, the term for this is future-proofing.

On the other hand, if you use the term future-proofing in Redmond, people will interpret it differently. In Redmond, future-proofing means designing a system so that it continues to function without alteration, even if something happens in the future. (For example, one example of future-proofing—in the Redmond sense of the term—would be using a function like SHGetSpecialFolderPath instead of hard-coding the path to a directory.)

Update: Some folks have taken issue with this definition, and I will have to defer to their local knowledge. I get my reports on the Reading dialect of Microspeak from my contacts there, so it's possible that they were mistaken, or that the usage was peculiar to their workgroup and incorrectly extrapolated to the entire dialect.

Posted by oldnewthing | 16 Comments
Filed under: ,

It looks a little like CMD except there is white on the background

Surely by now you've seen the video where NetGenHacker101 shows you how to use the "Tracer T" program to view "how many IP's are looking at Google", their name, and connection speed (to then to then to then). (And commenter squizz explains why it "worked" in spite of the http prefix.)

But more awesome is the fact that somebody ported the video to linux!

Bonus video craziness: It's in Korean but somehow that just adds to the insanity. (Warning: Five minutes of your life you will never get back.)

The comments on the YouTube video identify the song as "Bo Peep Bo Peep <- possibly the most addictive/annoying song ever."

Why can't I use the linker to delay-load a function from kernel32?

For some time (I am too lazy to look up when it was introduced), the Visual Studio linker has supported a feature known as delay-loading. But why can't you use this feature to delay-load a function from kernel32? It would be very handy: If you write

if (CurrentWindowsVersionSupportsKernelFunctionXyz())
{
  Xyz(...);
}

the program fails to load on versions of Windows which do not support the function Xyz because the Win32 load rejects loading a module that contains unresolved references. On the other hand, if you could mark kernel32 as delay-loaded, then the code above would work, since the call to Xyz would be redirected to a stub that calls GetProcAddress. Since the GetProcAddress is performed only when the code path is hit, the loader won't complain at load time. But if you try to delay-load kernel32, the linker gets upset at you. Why won't it let me delay-load kernel32?

The linker delay-load feature operates on the DLL level, not on the function level. When you put a DLL on the /DELAYLOAD list, the linker changes all calls to functions in that DLL into calls to linker-generated stubs. These stubs load the target DLL, call GetProcAddress, then resume execution at the target function.

Since the delay-load feature operates on the DLL level, if you put kernel32 on the delay-load list, then all calls to functions in kernel32 turn into calls to stubs.

And then you are trapped in this Catch-22.

When a function from kernel32 gets called, transfer goes to the stub function, which loads the target DLL (kernel32) to get the target function. Except that loading the target DLL means calling LoadLibrary, and finding the target function means calling GetProcAddress, and these functions themselves reside in kernel32.

Now you're trapped. To load kernel32, we need to call LoadLibrary, but our call to LoadLibrary was redirected to a stub which... calls LoadLibrary.

Sure, the linker folks could have added special casing for kernel32, say, having a list of core functions like InitializeCriticalSection which are never delay-loaded and always go directly into kernel32. But that's really out of scope for the /DELAYLOAD feature, whose purpose is not to make it easier to call functions which might not be there, but rather to assist in application startup performance by avoiding the cost of loading the target DLL until a function from it is called. If there were functions that went directly into kernel32, then the stated purpose of delay-loading fails: that import of InitializeCriticalSection forces kernel32 to be loaded when the module is loaded, completely contrary to the aim of delay-loading to avoid loading kernel32 at module load time.

Now, it's certainly a nice feature to be able to perform delay-loading on a per-function level, in order to make it easier to write code which changes behavior based on the current version of Windows, but that's a different problem from what the /DELAYLOAD switch was created to solve.

Posted by oldnewthing | 20 Comments
Filed under:

How do I suppress full window drag/resize for just one window?

A customer asked,

Is there a way to turn off Full Window Drag on a single window? I have a resizable control that I would like not update itself while resizing.

It so happens that I wrote a sample program ages ago to illustrate how to do this. You can find it in the Platform SDK under winui\fulldrag. The source code is also reproduced in this Knowledge Base article.

In addition to deferring painting, you may also want to defer layout if layout is expensive for your window.

Posted by oldnewthing | 12 Comments
Filed under:

Microsoft phenomenon: The annual award that winds up being awarded only once

The Grammy Awards will be handed out this upcoming weekend, an annual award that seems to have survived.

A not uncommon phenomenon at Microsoft is the annual award that winds up being awarded only once. Because all the excitement is in the announcement, not in the actual award.

Every year, we want to uniquely call out and recognize a set of people. I'm proud to kick off the XYZ Awards, which we will be given every year, starting this year, which recognize employees who best represent ABC and DEF.

The XYZ Awards were indeed handed out that first year with great pomp and circumstance.

And were never heard from again.

This is a special case of the more general phenomenon of the introduction of some undertaking to great fanfare, only to have it quietly fade away into obscurity without any formal announcement that it had ended. One might cynically observe that the likelihood of this happening to your project increases the more dramatically it is introduced. If it's just called a program, then it might survive. If it's called an initiative, then you might want to hold off on ordering new business cards for a while. And if it's called a bold new initiative, then you'll want to spend some time freshening your résumé, because your project is doomed.

Update since people seem to be missing the point: I'm not talking about marketing campaigns. Those are meant to die out eventually. I'm talking about stuff like The Council for Programming Excellence (which meets only once) or The DTI Program (which has a kickoff meeting and then nothing).

Posted by oldnewthing | 19 Comments
Filed under:

What idiot would hard-code the path to Notepad?

There seemed to be a great deal of disbelief that anybody would hard-code the path to Notepad.

Here's one example and here's another.

There's a large class of problems that go like this:

I'm running Program X, and when I tell it to view the error log, I get this error message: CreateProcess of "C:\Windows\Notepad.exe errorlog.txt" failed: error 2: The system cannot find the file specified. What is wrong and how do I fix it?

Obviously, the file C:\Windows\Notepad.exe is missing. But how can that be? Well, Windows Server 2008 bit the bullet and removed one of the copies of Notepad. Once you learn this, troubleshooting the above problem becomes a simple exercise in psychic debugging.

My psychic powers tell me that you're running Windows Server 2008. The Notepad program no longer exists in the Windows directory; it's now in the system directory. Find the setting for your program that lets you change the program used for viewing error logs and tell it to use C:\Windows\System32\Notepad.exe.

Of course, this tip works only if the program permits you to change the program used for viewing error logs. If they hard-code the path, then you'll have to find some other workaround. (For example, you might try using the CorrectFilePaths shim.)

Posted by oldnewthing | 46 Comments
Filed under:
More Posts Next page »
 
Page view tracker