Вы многопоточный?
Я видел проблемы с открытием файлов с ShellExecute. Не исполняемые файлы, а файлы, связанные с приложением - обычно MS Office. Приложения, которые использовали DDE для открытия своих файлов, делали передачу сообщений всем потокам во всех (ну, я не знаю, было ли это все ...) программами. Поскольку я не закачивал сообщения в рабочие потоки в своем приложении, я на некоторое время повесил оболочку (и открывал файл). В конечном итоге истекло время ожидания обработки сообщения, и приложение запустится и откроет файл.
Я помню, как использовал PeekMessage в цикле, чтобы просто удалить сообщения в очереди для этого рабочего потока. Я всегда предполагал, что есть способ избежать этого по-другому, может быть, создать поток по-другому, чтобы никогда не быть целью сообщений?
Обновление
Должно быть, это был не какой-то поток, который делал это, а один, обслуживающий окно. Раймонд (ссылка 1) знает все (ссылка 2) . Могу поспорить, что CoInitialize (однопотоковая квартира) или что-то в MFC создали скрытое окно для потока.