Como corrigir Dwmapi.dll dependência atraso de carga sob WinXP?
-
05-07-2019 - |
Pergunta
Eu construí um .dll sob WinXP que afirma que não consegue encontrar Dwmapi.dll quando ele é carregado. O problema é que esta DLL é uma DLL Vista, e este um problema conhecido para os usuários do XP que têm IE7 instalado. A recomendação é para desinstalar o IE7 ou reparar o .NET Framework através de programas Adicionar / remover. Eu fiz o reparo, e nada mudou. Eu não estou prestes a desinstalar o IE7 desde que deve haver uma solução melhor que não é o equivalente de "janelas Reinstale".
Eu li coisas ruins sobre as pessoas que tentaram desinstalar o IE7, então eu estou relutante em ir por esse caminho.
Eu estou usando C ++ em Visual Studio 2003 (7,1). Eu não vejo uma opção onde eu possa ter forçado carregamento de atraso no lançamento do aplicativo. Eu apenas usei as configurações padrão quando eu criei o projeto DLL. Eu tinha só agora encontrar uma opção interessante, Linker-> input-> Atraso DLLs carregadas, então eu coloquei Dwmapi.dll lá para forçá-lo a ser carregado com atraso. No entanto, eu recebo este quando ligar:
LINK : warning LNK4199: /DELAYLOAD:dwmapi.dll ignored; no imports found from dwmapi.dll
.. e, claro, não mudou uma coisa ao tentar carregar a minha DLL. Para os pedaços dele, eu adicionei toda a árvore de DLLs que levam a Dwmapi.dll, e eu recebo a mesma mensagem. (Para o registro, é foundation.dll-> shell32.dll-> shdocvw.dll-> mshtml.dll-> ieframe.dll-> dwmapi.dll.)
Para ser mais específico sobre o que estou fazendo, eu estou escrevendo um Maya plug-in e obter o texto sempre útil no editor de 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) //
Eu costumava Dependency Walker para rastrear inicialmente para baixo o problema, e é isso que me levam a Dwmapi.dll. Estes são a mensagem depende me dá, e Dwmapi.dll é a única coisa que tem um ponto de interrogação amarelo ao lado dele:
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.
Gerald é certo. Maya é, de fato, usando um caminho diferente do que o Dependency Walker. Meu plug-in carrega outro DLL (para processamento de imagem) que vive no diretório de plug-ins Maya e depende encontrado sem nenhum problema, mas Maya não. Eu tive que adicionar "; plug-ins". Ao PATH no Maya.env
Já que este problema não estava relacionado com Dwmapi.dll depois de tudo, mas DWMAPI é um problema comum, vou postar o melhor link que eu encontrei sobre o assunto DWMAPI no site da Novell aqui . Basicamente, a maioria dos programas terá este aviso em depends.exe, mas se há um ícone de atraso de carga ao lado dele, e você tem certeza de que o programa não vai chamar direta ou indiretamente DWMAPI, então tudo bem. O problema está em outro lugar. Se o ícone do atraso de carga não está presente, então você tem que olhar para as opções / atraso e / DELAYLOAD em Visual Studio. O fato de que depende me deu uma "advertência" e não um "erro" foi uma pista para o fato de que DWMAPI não está a ser carregado automaticamente.
Solução
Com base no seu problema atualizado, Dwmapi.dll provavelmente não é o seu problema. Dependência Walker sempre lhe dará esse erro sempre que você está ligando para MSHTML como sempre cheques atrasar DLLs carregadas.
Neste ponto, o meu melhor palpite é que você tem o seu conjunto de projeto para carregar dinamicamente as bibliotecas de tempo de execução e o caminho de pesquisa para DLLs está sendo alterado por Maya. Por isso, pode ser incapaz de encontrar o MSVC runtime DLL (s). Eu não desenvolveram plugins Maya em um longo tempo, mas eu tive esse problema com outros aplicativos que têm plug-in DLLs recentemente.
Tente alterar a configuração em C / C ++ -> Código Generation-> Runtime Library para multi-threaded em vez de multi-threaded DLL
.Além de que você pode tentar mexer com Dependency Walker para torná-lo usar os mesmos caminhos de pesquisa como Maya e veja se você pode vir até com um outro problema de dependência.
Como último recurso você pode lançar Maya em um depurador e definir um ponto de interrupção na LoadLibrary e descobrir qual biblioteca não está sendo carregado dessa forma.
Outras dicas
Este é um assunto delicado. Não há realmente 2 principais maneiras que você irá obter este erro.
1) Você tem o seu conjunto de projeto para atraso vigor carregado DLLs para carregar na inicialização do aplicativo. Dwmapi.dll é uma DLL carregadas com atraso e, portanto, normalmente não será carregado a menos que uma das suas funções é chamado. Isso não vai acontecer no XP a menos que você está tentando fazê-lo em sua DLL. Mas é possível definir uma opção de compilador para forçar o aplicativo para carregar o atraso carregado DLLs de qualquer maneira. Se você estiver fazendo isso, não.
2) É muitas vezes um falso erro que você vai começar a partir depends.exe quando há outro problema. Executar o seu DLL através dependência walker e ver se há quaisquer outros problemas de dependência. Se tudo isso falhar, tente desinstalar o IE7 e ver se as persistir problemas. Se é um erro falso, depois de instalar o IE7 você verá o erro real. Você pode instalar o IE7 novamente mais tarde.
Eu tive exatamente esse problema.
Sneaky problema que levou horas para resolver.
De qualquer forma. Eu compilei meu aplicativo gerenciado C ++ na máquina liberação. Tenho queixas de clientes que não poderia executá-lo, funcionou como um encanto em todas as nossas máquinas.
Descobriu-se que a máquina liberação foi corrigida automaticamente uma noite há um mês com a correção da vulnerabilidade ATL, e assim foi todas as outras máquinas também, exceto uma máquina de XP.
Essa máquina particulare XP não poderia executar o aplicativo também. Instalado a correção ATL (ver link abaixo), e voilá, tudo funcionou como antes.
Assim, lição aprendida, sempre verifique seus manifestos intermediários (encontrado o na depuração ou diretório release), que irá dizer-lhe qual a versão da DLL que o programa tem sido associada contra.
Hope isso ajuda ninguém.
Tente alterar a configuração em C / C ++ -> Código Generation-> Runtime Library para multi-threaded em vez de multi-threaded DLL
.