Если при загрузке exe не может найти каких-то dll, то loader показывает соответствующее сообщение (которое можно отключать через SetErrorMode) и закрывает программу. К сожалению, CreateProcess возвращает 1 еще до того как loader начнет грузить dll. Можно ли как-нибудь програмно запустив exe получить сообщение об ошибке (и обработать внутри программы которая запустила этот exe) если запущенный exe не нашел нужных библиотек? Вариант запускать exe в отладочном режиме исключается, так как от этого страдает скорость выполнения.
Тоже когда-то хотел разобраться , а потом забил . Может пригодиться , если кто подскажет каким нормальным способом это можно узнать (кто не понял вопроса , пример в аттаче) . Там вроде получаеться обьекты процесс и поток создаються без ошибок , а в entrypoint стартуемого модуля управление не передаёться . И из нового процесса выгружаються все модули . _185093951__createprocess.zip
Решил я таки проблему. Ключ в том что можно сразу после CreateProcess сделать CreateRemoteThread, и этот созданный поток начнет выполняться только после того, как луадер загрузит все dll-ки. Т.е. если в CreateRemoteThread передать указатель на ::FreeLibrary и параметр 0, то этот трэд ничего не сделает и сразу выйдет, но начнет выполняться после всех инициализаций. Т.е. как только этот трэд перестал существовать - значит все проинициализировалось. Ну а ошибку можно легко перехватить/узнать следя за top level windows создаваемые csrss.exe (который и показывает сообщение о отсутствующей dll). Только оказалось что на windows terminal server, этих csrss.exe может несколько штук быть одновременно, но если это учесть, то все работает замечательно.