Как исправить зависимость задержки загрузки DWMAPI.DLL под WinXP? - PullRequest
27 голосов
/ 06 октября 2008

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

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

Я использую C ++ под Visual Studio 2003 (7.1). Я не вижу опции, в которой я мог бы принудительно отложить загрузку при запуске приложения. Я просто использовал настройки по умолчанию при создании проекта DLL. Я только что нашел интересную опцию, Linker-> Input-> Delay Loaded DLLs, поэтому я поместил туда 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.

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

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

Ответы [ 4 ]

7 голосов
/ 07 октября 2008

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

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

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

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

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

3 голосов
/ 25 августа 2009

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

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

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

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

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

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

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

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

3 голосов
/ 06 октября 2008

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

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

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

2 голосов
/ 17 сентября 2010

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

...