Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическая загрузка DirectX  (Прочитано 5922 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 14-10-2011 20:20 » 

Есть очень простая строчка кода:
Код: (C++)
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-ки в этом месте загружаются без вопросов - будто бы никакие лимиты не превышаются.

С какой ещё стороны можно к этому подобраться?
« Последнее редактирование: 14-10-2011 20:21 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 15-10-2011 12:01 » 

Решено.

Был конфликт версий библиотек - лежали местами сомнительные копии, и система их обнаруживала. 1114 ошибку выдавали те версии библиотек, которые не совпадали со сборкой DirectX, установленной на данной машине (видимо по своим зависимостям что-то не могло подгрузиться).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines