Domanda

Ho creato un .dll sotto WinXP che afferma che non riesce a trovare DWMAPI.DLL quando viene caricato. Il problema è che questa DLL è una DLL Vista e questo è un problema noto per gli utenti XP che hanno installato IE7. Il consiglio è di disinstallare IE7 o riparare .NET Framework tramite Installazione applicazioni. Ho fatto la riparazione e non è cambiato nulla. Non sto per disinstallare IE7 poiché ci deve essere una soluzione migliore che non è l'equivalente di " reinstall windows " ;.

Ho letto cose brutte sulle persone che hanno tentato di disinstallare IE7, quindi sono riluttante a seguire questa strada.

Sto usando C ++ in Visual Studio 2003 (7.1). Non vedo un'opzione in cui potrei aver forzato il caricamento ritardato all'avvio dell'applicazione. Ho appena usato le impostazioni predefinite quando ho creato il progetto DLL. Ho appena trovato un'opzione interessante, Linker- > Input- > Ritardare le DLL caricate, quindi ho inserito DWMAPI.DLL per forzare il caricamento ritardato. Tuttavia, ottengo questo quando si collega:

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

.. e ovviamente non ha cambiato nulla quando ho provato a caricare la mia DLL. Per diamine, ho aggiunto l'intero albero delle DLL che portano a DWMAPI.DLL e ricevo lo stesso messaggio. (Per la cronaca, è foundation.dll- > shell32.dll- > shdocvw.dll- > mshtml.dll- > ieframe.dll- > dwmapi.dll.)

Per essere più specifico su ciò che sto facendo, sto scrivendo un plugin Maya e ottengo il testo sempre utile nell'editor di 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) //

Ho usato Dependency Walker per rintracciare inizialmente il problema, ed è questo che mi ha portato a DWMAPI.DLL. Questi sono i messaggi che mi dà e DWMAPI.DLL è l'unica cosa che ha un punto interrogativo giallo accanto:

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 ha ragione. Maya, infatti, sta usando un PERCORSO diverso dal Dipendente Walker. Il mio plug-in carica un'altra DLL (per l'elaborazione delle immagini) che risiede nella directory dei plug-in Maya e dipende dal fatto che l'ha trovata senza problemi, ma Maya no. Ho dovuto aggiungere "plug-in" al PERCORSO in Maya.env.

Visto che questo problema non era legato a DWMAPI.DLL dopo tutto, ma DWMAPI è un problema comune, posterò il miglior link che ho trovato sul problema DWMAPI sul sito Web di Novell qui . Fondamentalmente, la maggior parte dei programmi avrà questo avviso in depend.exe, ma se accanto c'è un'icona di caricamento ritardato e sei sicuro che il programma non chiamerà direttamente o indirettamente DWMAPI, allora va bene. Il problema è altrove. Se l'icona del caricamento ritardato non è presente, è necessario esaminare le opzioni / DELAY e / DELAYLOAD in Visual Studio. Il fatto che dipende mi ha dato un "avvertimento" e non un "errore" era un indizio del fatto che DWMAPI non veniva caricato automaticamente.

È stato utile?

Soluzione

In base al tuo problema aggiornato, DWMAPI.dll probabilmente non è il tuo problema. Dipendenza Walker ti darà sempre quell'errore ogni volta che ti colleghi a mshtml poiché controlla sempre le DLL caricate in ritardo.

A questo punto la mia ipotesi migliore è che il tuo progetto sia impostato per caricare dinamicamente le librerie di runtime e il percorso di ricerca per le DLL viene modificato da Maya. Quindi potrebbe non essere possibile trovare le DLL di runtime MSVC. Non ho sviluppato plugin Maya da molto tempo, ma ho avuto questo problema con altre app che hanno recentemente plugin DLL.

Prova a modificare le impostazioni in C / C ++ - > Code Generation- > Libreria di runtime in DLL multi-thread anziché multi-thread.

A parte questo, puoi provare a armeggiare con Dependency Walker per fargli usare gli stessi percorsi di ricerca di Maya e vedere se riesci a trovare un altro problema di dipendenza.

Come ultima risorsa puoi avviare Maya in un debugger e impostare un breakpoint su LoadLibrary e scoprire quale libreria non viene caricata in questo modo.

Altri suggerimenti

Questo è difficile. Ci sono davvero 2 modi principali per ottenere questo errore.

1) Il progetto è impostato per forzare il caricamento ritardato delle DLL caricate all'avvio dell'applicazione. DWMAPI.dll è una DLL con caricamento ritardato e quindi normalmente non verrà caricata a meno che non venga chiamata una delle sue funzioni. Ciò non accadrà su XP a meno che tu non stia provando a farlo nella tua DLL. Ma è possibile impostare un'opzione del compilatore per forzare l'app a caricare comunque le DLL caricate in ritardo. Se lo stai facendo, non farlo.

2) Spesso è un falso errore che si ottiene da depend.exe quando si verifica un altro problema. Esegui la tua DLL tramite walker delle dipendenze e vedi se ci sono altri problemi di dipendenza. Se tutto il resto fallisce, prova a disinstallare IE7 e verifica se il problema persiste. Se si tratta di un errore falso, dopo aver installato IE7 vedrai l'errore reale. È possibile installare nuovamente IE7 in seguito.

Ho avuto esattamente questo problema.

Problema subdolo che ha impiegato ore a risolvere.

In ogni caso. Ho compilato la mia applicazione C ++ gestita sulla macchina di rilascio. Ho ricevuto lamentele da parte di clienti che non potevano eseguirlo, hanno funzionato come un incantesimo su tutte le nostre macchine.

Si è scoperto che la macchina di rilascio è stata automaticamente patchata una notte al mese fa con la correzione della vulnerabilità ATL, così come tutte le altre macchine, tranne una macchina XP.

Neanche quella particolare macchina XP poteva eseguire l'applicazione. Ho installato la correzione ATL (vedi link sotto) e voil & # 225 ;, tutto ha funzionato come prima.

http: // www .microsoft.com / downloads / Details.aspx FamilyID = 766A6AF7-EC73-40FF-B072-9112BAB119C2 & amp;? displaylang = it

Quindi la lezione appresa, controlla sempre i tuoi manifest intermedi (trovato nella directory debug o release), che ti dirà su quale versione della DLL a cui è stato collegato il programma.

Spero che aiuti chiunque.

Prova a modificare le impostazioni in C / C ++ - > Code Generation- > Libreria di runtime in DLL multi-thread anziché multi-thread.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top