Есть очень простая строчка кода:
HMODULE hModule = LoadLibrary("d3d9.dll");
И есть у меня немаленькая программа, где она вызывается. Программа включает в себя обычный WinAPI, MFC, CLR.NET и ряд сторонних библиотек (напрямую с DirectX не работающих, однако, к примеру, CUDA конкурирует за ресурсы графической подсистемы).
Суть в том, что эта строчка кода то работает, то не работает при разных условиях. Не работает она с системной ошибкой 1114 (DllMain вернула FALSE). Когда работает - дальше всё работает нормально.
Сборка проекта происходит под Win7 x64, VS20080. Сборка под платформу x86. На всех тестируемых машинах нужная версия DirectX установлена.
Строчка не работает:
1) На XP, Server 2003 на любых версиях (x86, x64).
2) На Win7, если программа с нужным окружением установлена через инсталлятор (msi-файл).
3) При запуске при помощи ярлыка.
4) При запуске на машине, на которую зашли удалённым столом.
Строчка работает:
1) На Win7, если программу с нужным окружением (зависимыми dll-ками, исключая системные и DirectX) просто положить в папку и запускать оттуда.
2) На Win7, если программа запускается другой программой, запущенной пользователем, если всё это не было пропущено через инсталлятор.
3) На Win7, если программа запускается сервисом под LocalSystem через ...AsUser с токеном процесса в сессии пользователя и с некоторыми привилегиями, но непременно без удалённого стола, и если вся система из 3-х процессов не была пропущена через инсталлятор.
Любые комбинации прав, запуск под администратором, режимы совместимости со старыми версиями, прописывание ярлыке рабочего каталога - всё это никакого эффекта не даёт.
Полностью аналогичная сиутация с ddraw.dll. Либо они вместе загружаются, либо ни одна ни загружается.
Вопросы:
1) Знает ли кто-нибудь подробности: при каких обстоятельствах DirectX библиотеки возвращают 1114?
2) Что такое может делать инсталлятор, что один и тот же exe-шник ведёт себя по-разному без установки и после установки?
3) Чем, например, d3d9.dll в XP отличается от такой же в Win7?
Мною экспериментально исключены следующие факторы:
1) Оптимизаторы компилятора и линкера - всё выключено, никаких изменений.
2) MTA/STA - без разницы.
3) Наличие/отсутствие сторонних библиотек, включая CLR.NET - без разницы.
4) Порядок загрузки dll - без разницы, даже в самом начале WinMain либо грузит, либо нет.
5) Из каких потоков запускается - аналогично, без разницы.
6) Памяти (как основной, так и видео) - достаточно.
7) Другие dll-ки в этом месте загружаются без вопросов - будто бы никакие лимиты не превышаются.
С какой ещё стороны можно к этому подобраться?