2008-10-06 5 views
27

로드 될 때 DWMAPI.DLL을 찾을 수 없다고 주장하는 WinXP에서 .dll을 빌드했습니다. 문제는이 DLL이 Vista DLL이며 IE7이 설치된 XP 사용자에게 알려진 문제입니다. IE7을 제거하거나 프로그램 추가/제거를 통해 .NET Framework를 복구하는 것이 좋습니다. 나는 수리를했고, 아무것도 바뀌지 않았다. 나는 "reinstall windows"와 동등하지 않은 더 나은 솔루션이 있어야하기 때문에 IE7을 제거하려고하지 않습니다.WinXP에서 DWMAPI.DLL 지연로드 종속성을 수정하는 방법은 무엇입니까?

나는 IE7을 제거하려고 시도한 사람들에 대해 나쁜 점을 읽었으므로 그 경로를 사용하기를 꺼립니다.

Visual Studio 2003 (7.1)에서 C++을 사용하고 있습니다. 애플리케이션 실행시 지연로드를 강제 할 수있는 옵션이 표시되지 않습니다. 방금 DLL 프로젝트를 만들 때 기본 설정을 사용했습니다. 필자는 흥미로운 옵션 인 Linker-> Input-> Delay Loaded DLL을 발견 했으므로 DWMAPI.DLL을 거기에 넣고 지연로드되도록했습니다. 그러나, 링크 할 때 이것을 얻습니다.

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

.. 내 DLL을로드하려고 할 때 물론 변경되지 않았습니다. 그것의 지옥 들어, DWMAPI.DLL로 이어지는 DLL의 전체 트리를 추가하고 동일한 메시지가 나타납니다. (기록을 위해, foundation.dll-> shell32.dll-> shdocvw.dll-> mshtml.dll-> ieframe.dll-> dwmapi.dll입니다.)

내가하고있는 일에 대해 더 구체적으로 말하자면 나는 마야 플러그인을 작성하고 스크립트 편집기에서 항상 유용한 텍스트 수 있어요 :

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

내가 처음에 문제를 추적하는 데 사용 종속성 워커, 그리고 그게 날 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는 Dependency Walker와는 다른 PATH를 사용합니다. 내 플러그인은 Maya 플러그인 디렉토리에 살고있는 다른 DLL (이미지 처리 용)을로드하고 문제가없는 것으로 밝혀졌지만 Maya는 그렇지 않았습니다. Maya.env의 PATH에 "; 플러그인"을 추가해야했습니다.

결국이 문제는 DWMAPI.DLL과 관련이 없지만 DWMAPI는 일반적인 문제이므로 Novell 웹 사이트 here에서 DWMAPI 문제와 관련하여 찾은 최고의 링크를 게시 할 것입니다. 기본적으로 대부분의 프로그램은 depends.exe에이 경고를 표시합니다. 그러나 지연로드 아이콘이 옆에 있고 프로그램이 직접 또는 간접적으로 DWMAPI를 호출하지 않는다고 확신하는 경우에는 문제가 없습니다. 문제는 다른 곳에있다. 지연로드 아이콘이 없으면 Visual Studio에서/DELAY 및/DELAYLOAD 옵션을 확인해야합니다. 의존하는 사실로 인해 "경고"가 아닌 "오류"가 DWMAPI가 자동으로로드되지 않는다는 사실에 대한 단서가되었습니다.

+1

Windows 2003 서버 중 하나에서이 문제가 발생했습니다. 그것은 단지 피투성이의 콘솔 앱이고 dwmapi.dll을 원한다고 주장합니다 (또는 다른 의존성). 나는 이것에 대한 명확한 대답을보고 싶다. +1. – Kev

+0

많은 의견은 Google 드라이브 바이크에서 비롯된 것 같습니다. "dwmapi.dll"을 검색하면이 결과가 두 번째 결과로 나타납니다. –

답변

7

업데이트 된 문제점에 따라 DWMAPI.dll이 문제가 아닐 수도 있습니다. 종속 보행기는 항상 지연로드 된 DLL을 검사하므로 mshtml에 연결할 때마다 항상 오류를 발생시킵니다.

이 시점에서 내 생각에 프로젝트가 런타임 라이브러리를 동적으로로드하도록 설정되어 있고 DLL의 검색 경로가 Maya에 의해 변경되고 있습니다. 따라서 MSVC 런타임 DLL을 찾을 수 없습니다. 오랫동안 Maya 플러그인을 개발하지는 못했지만 최근에 DLL을 플러그인 한 다른 응용 프로그램에서이 문제를 겪었습니다.

C/C++ -> 코드 생성 -> 런타임 라이브러리에서 설정을 멀티 스레드 DLL이 아닌 멀티 스레드로 변경하십시오.

그 외에도 Dependency Walker를 사용하여 Maya와 동일한 검색 경로를 사용하고 다른 종속성 문제가 발생할 수 있는지 확인할 수 있습니다.

마지막 수단으로 디버거에서 Maya를 시작하고 LoadLibrary에 중단 점을 설정하고 어떤 라이브러리가로드되지 않는지 확인할 수 있습니다.

+0

스레드에있는 네크로 맨서가 아니고 단지이 같은 문제를 디버깅 한 상태에서 뭔가 추가하고 싶었습니다. dll이 정적으로 링크되어있는 것을 발견하면 (Gerald가 제시 한 바와 같이) 여전히 Visual Studio로 dll을로드하고 그 매니페스트를 확인해야합니다. 프로젝트가 다른 사람이 만든 것이라면, 의존성이 무엇인지를 이진 파일에 포함시킨 .manifest 파일을 포함 시켰을 수 있으며, OS가 DLL을 정적으로 링크하더라도 문제가 있다고 주장 할 것입니다 . .manifest를 찾아서 주석을 달고 다시 컴파일하면 문제가 해결 될 수 있습니다. – Decker

3

이것은 까다로운 내용입니다. 이 오류가 발생하는 주된 두 가지 방법이 있습니다.

1) 응용 프로그램 시작시 지연로드 된 DLL을 강제로로드하도록 프로젝트를 설정했습니다. DWMAPI.dll은 지연로드 DLL이므로 함수 중 하나가 호출되지 않으면 일반적으로로드되지 않습니다. 그것은 당신이 DLL에서 그것을하려고하지 않는 한 XP에서 발생하지 않습니다. 하지만 컴파일러 옵션을 설정하여 앱에 지연로드 된 DLL을로드하도록 할 수 있습니다. 네가 그렇게한다면하지 마라.

2) 다른 문제가있을 때 depends.exe에서 가져 오는 경우가 종종 잘못된 오류입니다. 종속성 워커를 통해 DLL을 실행하고 다른 종속성 문제가 있는지 확인하십시오. 다른 모든 방법이 실패하면 IE7을 제거하고 문제가 지속되는지 확인하십시오. 잘못된 오류 인 경우 IE7을 설치하면 실제 오류가 표시됩니다. 나중에 IE7을 설치할 수 있습니다.

3

나는이 문제가 정확히 발생했습니다.

해결하기까지 몇 시간이 걸렸습니다.

어쨌든. 릴리스 컴퓨터에서 관리되는 C++ 응용 프로그램을 컴파일했습니다. 그것을 실행할 수없는 고객의 불만이 우리 기계의 모든 매력에 작용했습니다.

릴리스 머신이 한 달 전에 ATL 취약점 수정으로 한 달 전에 자동으로 패치되었고, 다른 한 대의 컴퓨터도 한 대의 XP 시스템을 제외하고 모두 자동으로 패치되었습니다.

해당 XP 시스템에서 응용 프로그램을 실행할 수 없습니다. ATL 픽스를 설치하고 (아래 링크 참조), 모든 것이 이전과 똑같이 작동합니다.

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

그래서 교훈은 항상 프로그램에 링크 된 DLL의 버전을 말할 것이다, (디버그의 발견이나 디렉토리를 해제)하여 중간 매니페스트를 확인 배웠습니다.

희망은 누구에게나 도움이됩니다.

2

C/C++ -> 코드 생성 -> 런타임 라이브러리에서 설정을 멀티 스레드 DLL이 아닌 멀티 스레드로 변경하십시오.

+0

이 광고는 저에게 효과적이었습니다 - 감사합니다. –