Некоторое время назад я сделал пост о создании библиотеки 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
Блокировка загрузчика — это блокировка для каждого процесса, которая принадлежит сразу после вызова LoadLibrary, до того, как LoadLibrary вернется. Он предназначен для того, чтобы процесс правильно учитывал загруженные библиотеки DLL и их порядок.
В DllMain может быть добавлено очень мало кода, который не подвергается риску сбоя, поскольку любой вызов Windows, который может вызвать IPC, может привести к зависанию блокировки загрузчика.
Если вы можете создать поток извне процесса или создать вторую функцию, которую вы можете вызвать напрямую, тогда это будет лучшим решением.
Других решений пока нет …