Как я могу проверить, выполняется ли мой код в DllMain - PullRequest
3 голосов
/ 06 апреля 2011

Я пишу плагин для какой-то системы, однако есть некоторые некорректно работающие приложения, которые вызывают мой плагин во время инициализации dll (либо из DllMain, либо из InitInstance, которая является оболочкой для DllMain).

Мне было интересно, есть ли способ узнать, выполняется ли код в DllMain или нет. Я не хочу терпеть неудачу изящно, не вызывая взаимоблокировку (код, который выполняет мой плагин, включает загрузку dll, создание потока и ожидание события, которое вызывает взаимоблокировки при выполнении в DllMain).

Мне известно о том, что CreateThread не будет выполняться до тех пор, пока не завершится DllMain, однако я не могу выполнить инициализацию из другого потока, так как это связано с COM.

Ответы [ 4 ]

3 голосов
/ 06 апреля 2011

Практически вы запрашиваете способ просмотра состояния блокировки загрузчика, однако Windows API не позволяет этого, так как он никак не раскрывает блокировку загрузчика. Даже если бы вы смогли получить состояние блокировки, вы не могли бы гарантировать, что оно останется таким же во время выполнения вашего последующего кода - вам придется его получить, и это превосходит цели, так как вы этого хотите избежать .

Итак, насколько я вижу, единственный практический способ справиться с этим - документировать ваш плагин и запретить его использование из DllMain (). Если это означает, что некоторым владельцам компонентов придется немного изменить дизайн своей инициализации DLL, пусть будет так.

0 голосов
/ 06 апреля 2011

Когда я застрял в подобных ситуациях и printf не обрезает его, я попытаюсь создать файл. Используйте ваше сообщение в качестве имени файла вместе с метками времени. Это может вам помочь, удачи.

0 голосов
/ 06 апреля 2011

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

0 голосов
/ 06 апреля 2011

Я не верю, что есть какая-либо система, обеспечивающая способ сделать это. Однако, поскольку блокировка загрузчика гарантирует, что одновременно работает только один dllmain, было бы легко установить флаг в начале dllmain и сбросить его в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...