Holy cow, I wrote a book!
This question came in from a customer (paraphrased):
If I run my program from the command prompt, it works great, but if I run it from my launcher via ShellExecuteEx, it never appears.
ShellExecuteEx
See how good your psychic powers are at solving this problem before I give you the second question that gives away the answer.
Any luck?
Here's a second question from a different source (but which coincidentally came in the same day).
I'm trying to use ShellExecute to open a document. The function succeeds (returns a value greater than 32), but I don't get anything on the screen. if (ShellExecute(Handle, NULL, FileName, NULL, NULL, NULL) <= (HINSTANCE)32) ...
ShellExecute
if (ShellExecute(Handle, NULL, FileName, NULL, NULL, NULL) <= (HINSTANCE)32) ...
The problem the second person is having lies in the last parameter to the ShellExecute function. It's nShowCmd, which is supposed to be an SW_* value, but which this person is passing as NULL. It so happens, that the value zero corresponds to SW_HIDE, which explains why the program doesn't appear: You told it to run hidden!
nShowCmd
SW_*
NULL
SW_HIDE
Now go back to the first problem. Do you see what the person most likely did wrong? The code probably went like this:
SHELLEXECUTEINFO sei = { sizeof(sei) }; sei.hwnd = hwnd; sei.lpVerb = TEXT("open"); sei.lpFile = pszFile; ShellExecuteEx(&sei);
Since the sei.nShow member was not explicitly set, the value was implicitly set to zero by the incomplete initializer. And as we noted above, zero means SW_HIDE.
sei.nShow
It turns out my psychic debugging was correct. That was indeed the source of the first person's problem. Now you can use your psychic powers, too.