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

StackOverflow https://stackoverflow.com/questions/173433

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

Я использую C++ в 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, и получаю то же сообщение.(Для справки, это Foundation.dll->shell32.dll->shdocvw.dll->mshtml.dll->ieframe.dll->dwmapi.dll .)

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

// 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.

Джеральд прав.Фактически Maya использует другой PATH, чем Dependency Walker.Мой плагин загружает другую DLL (для обработки изображений), которая находится в каталоге плагинов Maya, и зависит от того, нашел ее без проблем, а Maya - нет.Мне пришлось добавить «;плагины» в PATH в Maya.env.

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

Это было полезно?

Решение

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

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

Попробуйте изменить настройки в C / C ++ -> Code Generation -> Runtime Library для многопоточных, а не многопоточных DLL.

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

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

Другие советы

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

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

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

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

Коварная проблема, на решение которой ушли часы.

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

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

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

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

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

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

Попробуйте изменить настройки в C / C ++ -> Code Generation -> Runtime Library для многопоточных, а не многопоточных DLL.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top