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.

Foi útil?

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.

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

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

.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top