Подтвердить что ты не робот

Как исправить зависимость задержки задержки DWMAPI.DLL в WinXP?

Я построил .dll под WinXP, который утверждает, что не может найти DWMAPI.DLL при загрузке. Проблема в том, что эта DLL - это DLL Vista, и это известная проблема для пользователей XP, у которых установлен IE7. Рекомендация состоит в том, чтобы удалить IE7 или восстановить .NET Framework с помощью программы "Установка и удаление программ". Я сделал ремонт, и ничего не изменилось. Я не собираюсь удалять IE7, так как должно быть лучшее решение, не эквивалентное "переустановке окон".

Я читал плохие вещи о людях, которые пытались удалить IE7, поэтому я не хочу идти по этому маршруту.

Я использую С++ в Visual Studio 2003 (7.1). Я не вижу вариант, когда я могу принудительно задерживать загрузку при запуске приложения. Я просто использовал настройки по умолчанию, когда я создал проект DLL. Я только что нашел интересный вариант, Linker- > Input- > Delay Loaded DLL, поэтому я поместил DWMAPI.DLL, чтобы заставить его задерживаться. Однако я получаю это при ссылке:

LINK : warning LNK4199: /DELAYLOAD:dwmapi.dll ignored; no imports found from dwmapi.dll

.. и он, конечно, ничего не изменил при попытке загрузить мою DLL. К черту этого, я добавил все дерево DLL, которые приводят к DWMAPI.DLL, и я получаю то же сообщение. (Для записи это файл base.dll- > shell32.dll- > shdocvw.dll- > mshtml.dll- > ieframe.dll- > dwmapi.dll.)

Чтобы быть более конкретным в том, что я делаю, я пишу плагин Maya и получаю всегда полезный текст в редакторе script:

// Error: Unable to dynamically load : D:/blahblahblah/mydll.mll
The specified module could not be found.
 //
// Error: The operation completed successfully.
 //
// Error: The operation completed successfully.
 (mydll) //

Я использовал Dependency Walker для первоначальной отслеживания проблемы, и это привело меня к DWMAPI.DLL. Это зависит от сообщения, и DWMAPI.DLL - единственное, у которого есть желтый вопросительный знак рядом с ним:

Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

Джеральд прав. Майя, по сути, использует другую PATH, чем Walker Dependency. Мой плагин загружает другую DLL (для обработки изображений), которая живет в директории плагинов Maya и зависит от ее поиска без проблем, но Майя этого не сделала. Я должен был добавить "плагины" к PATH в Maya.env.

Увидев, что эта проблема не была связана с DWMAPI.DLL, но DWMAPI - распространенная проблема, я опубликую лучшую ссылку, которую я нашел о проблеме DWMAPI на веб-сайте Novell . В основном, большинство программ будут иметь это предупреждение в файле depend.exe, но если рядом с ним есть значок задержки, и вы уверены, что программа напрямую или косвенно не вызовет DWMAPI, тогда это нормально. Проблема в другом месте. Если значок задержки не присутствует, вы должны посмотреть параметры /DELAY и/DELAYLOAD в Visual Studio. Тот факт, что от этого зависит, дал мне "предупреждение", а не "ошибку", было ключом к тому, что DWMAPI не загружается автоматически.

4b9b3361

Ответ 1

Исходя из вашей обновленной проблемы, DWMAPI.dll, вероятно, не является вашей проблемой. Зависимость ходок всегда будет давать вам эту ошибку всякий раз, когда вы связываетесь с mshtml, поскольку она всегда проверяет задержку загрузки DLL.

На этом этапе лучше всего предположить, что у вас есть свой проект, чтобы динамически загружать библиотеки времени выполнения, а путь поиска для DLL меняется Майей. Таким образом, может не удастся найти DLL (-ы) среды выполнения MSVC. Я давно не разрабатывал плагины Maya, но у меня была эта проблема с другими приложениями, в которых недавно появились плагины DLL.

Попробуйте изменить настройки в C/С++ → Генерация кода- > Библиотека времени выполнения для многопоточной, а не многопоточной DLL.

Кроме того, вы можете попробовать возиться с Dependency Walker, чтобы использовать те же пути поиска, что и Maya, и посмотреть, можете ли вы найти другую проблему зависимости.

В качестве последнего средства вы можете запустить Maya в отладчике и установить точку останова в LoadLibrary и узнать, какая библиотека не загружается таким образом.

Ответ 2

Это сложно. Там действительно 2 основных способа получить эту ошибку.

1) У вас установлен проект для принудительной загрузки загруженных DLL файлов при запуске приложения. DWMAPI.dll - это загруженная с задержкой DLL и, как правило, не загружается, если не вызвана одна из ее функций. Этого не произойдет на XP, если вы не попытаетесь сделать это в своей DLL. Но можно установить параметр компилятора, чтобы заставить приложение загружать загруженные DLL с задержкой в ​​любом случае. Если вы это делаете, не делайте этого.

2) Часто возникает ложная ошибка, которую вы получите от depend.exe, когда есть еще одна проблема. Запустите свою DLL через ходу зависимостей и посмотрите, есть ли другие проблемы с зависимостями. Если все остальное не удается, попробуйте удалить IE7 и посмотреть, не исчезла ли проблема. Если это ложная ошибка, после установки IE7 вы увидите реальную ошибку. После этого вы можете установить IE7.

Ответ 3

У меня была именно эта проблема.

Скрытая проблема, на которую потребовалось несколько часов.

В любом случае. Я скомпилировал мое управляемое приложение С++ на машине выпуска. Получил жалобы от клиентов, которые не смогли запустить его, работали как шарм на всех наших машинах.

Оказалось, что машина выпуска была автоматически исправлена ​​одна ночь месяц назад с помощью исправления уязвимости ATL, а также все остальные машины, кроме одной машины XP.

Эта машина XP также не могла запустить приложение. Установлено исправление ATL (см. Ссылку ниже), и все, все работает так же, как и раньше.

http://www.microsoft.com/downloads/details.aspx?familyid=766A6AF7-EC73-40FF-B072-9112BAB119C2&displaylang=en

Итак, извлеченный урок, всегда проверяйте свои промежуточные манифесты (найденные в папке отладки или выпуска), которые расскажут вам, какая версия DLL связана с программой.

Надеюсь, это поможет кому угодно.

Ответ 4

Попробуйте изменить настройки в C/С++ → Генерация кода- > Библиотека времени выполнения для многопоточной, а не многопоточной DLL.