При вызове D3D CREATEDEVICE из DLLMAIN из VC++ он создает тупик (loaderlock?). Есть ли способ преодолеть это? Конечная цель внутри

Некоторое время назад я сделал пост о создании библиотеки DLL для инъекций, которая заставит хост-приложение запускать ноутбук Nvidia Optimus для "пробуждения" dGpu. Это необходимо из-за созданной здесь патетической системы nvidia, которая приводит к тому, что МНОГИЕ приложения не распознают наличие мощности dGpu, а вместо этого используют встроенный Intel GPU. (В частности, некоторые приложения для обработки видео, которые используют Intel на несколько часов дольше, чем Nvidia). Этот пост был здесь.

Достаточно сказать, что я переехал на работу в Антарктику и разочаровался в проекте. Я просто забрал его несколько лет спустя и решил изучить (достаточно) C++, чтобы запрограммировать его здесь. Я создал DLL, и если я помещаю код DX в функцию, то вызываю эту функцию из программы вызывающего хоста. ЭТО РАБОТАЕТ!!! Однако, если я помещаю этот код в DLLMAIN, а затем просто загружаю эту dll из моей программы "вызывающей" (без фактического вызова конкретной функции)... процедура выполняется!!! Однако когда он попадает в ту часть кода, где выполняется CREATEDEVICE, происходит сбой. С тех пор я узнал, что это происходит из-за проблемы, называемой взаимоблокировкой или блокировкой блокировки. Я понимаю концепцию, но у меня нет нигде рядом с пониманием C++, чтобы найти обходной путь.

Так что в основном.. я могу запустить свою процедуру в DLLMAIN, используя какой-то обходной путь? Может быть, как-то породить независимый поток (чтобы DLLMAIN мог завершить выполнение до его возврата?) Спасибо за любую информацию. Я включу здесь исходный код vcproject... но это Франкенштейн из всего, что я нашел в Интернете... так что не ищите элегантности - я почти ничего не знаю о программировании на C++! http://s000.tinyupload.com/index.php?file_id=07876333208461296171

1 ответ

Блокировка загрузчика - это блокировка для каждого процесса, которая принадлежит сразу после вызова LoadLibrary, до того, как LoadLibrary вернется. Он предназначен для того, чтобы процесс правильно учитывал загруженные библиотеки DLL и их порядок.

В DllMain может быть добавлено очень мало кода, который не подвергается риску сбоя, поскольку любой вызов Windows, который может вызвать IPC, может привести к зависанию блокировки загрузчика.

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

Другие вопросы по тегам