CreateProcess и обработка ошибок

Тема в разделе "WASM.WIN32", создана пользователем digiways, 9 сен 2004.

  1. digiways

    digiways New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2004
    Сообщения:
    2
    Если при загрузке exe не может найти каких-то dll, то loader показывает соответствующее сообщение (которое можно отключать через SetErrorMode) и закрывает программу. К сожалению, CreateProcess возвращает 1 еще до того как loader начнет грузить dll. Можно ли как-нибудь програмно запустив exe получить сообщение об ошибке (и обработать внутри программы которая запустила этот exe) если запущенный exe не нашел нужных библиотек? Вариант запускать exe в отладочном режиме исключается, так как от этого страдает скорость выполнения.
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Тоже когда-то хотел разобраться , а потом забил .

    Может пригодиться , если кто подскажет каким нормальным способом это можно узнать (кто не понял вопроса , пример в аттаче) .



    Там вроде получаеться обьекты процесс и поток создаються без ошибок , а в entrypoint стартуемого модуля управление не передаёться . И из нового процесса выгружаються все модули .

    [​IMG] _185093951__createprocess.zip
     
  3. digiways

    digiways New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2004
    Сообщения:
    2
    Решил я таки проблему. Ключ в том что можно сразу после CreateProcess сделать CreateRemoteThread, и этот созданный поток начнет выполняться только после того, как луадер загрузит все dll-ки. Т.е. если в CreateRemoteThread передать указатель на ::FreeLibrary и параметр 0, то этот трэд ничего не сделает и сразу выйдет, но начнет выполняться после всех инициализаций. Т.е. как только этот трэд перестал существовать - значит все проинициализировалось. Ну а ошибку можно легко перехватить/узнать следя за top level windows создаваемые csrss.exe (который и показывает сообщение о отсутствующей dll). Только оказалось что на windows terminal server, этих csrss.exe может несколько штук быть одновременно, но если это учесть, то все работает замечательно.