2009-08-22 4 views
1

제목은 거의 이해할 수 없다는 것을 압니다. 그 이유는 대부분 한 줄로 설명하기가 쉽지 않기 때문입니다. 그래서 여기에 상황이 있습니다 :DWM/Aero가 활성화되어 있고 해당 코드가 2000/XP/Vista/7에 대해 동일한 바이너리에 존재하는지 확인

바이너리가 Windows 2000 이상을 대상으로하는 프로그램이 있습니다. 이제는 사용자가 Vista/7에서 실행되는지 확인하는 코드를 추가하고, 그렇다면 Aero/DWM이 사용되는지 확인하십시오. 이를 기반으로 특정 플랫폼과 관련이없는 몇 가지 사항을 비활성화하고 다른 기능을 사용하도록 설정합니다. 내 주요 문제는 Visual C++ 2008에서 DwmIsCompositionEnabled를 호출하기 위해 dwmapi.lib 파일을 추가하고 컴파일해야한다는 것입니다. Vista 나 7 이외의 다른 프로그램에서 바이너리를 실행하면 "구성 요소를 찾을 수 없습니다 .dwmapi.dll을 찾을 수 없기 때문에 응용 프로그램을 시작하지 못했습니다"오류가 발생합니다. 물론 이것은 DWM이 새롭고 구형 플랫폼에서는 사용할 수 없기 때문에 발생할 것으로 예상됩니다.

내 질문은 다음과 같습니다. 어떻게 든이 문제를 해결할 수 있습니까? 모든 OS 버전에 대해 하나의 바이너리가 있으며 해당 DWM 검사 코드가 포함되어 있습니까? 이 프로그램은 Visual Studio 2008, Visual C++에서 MFC를 사용하여 작성되었습니다.

+1

필자는 직접 해본 적이 없지만 특정 조건이 주어진 주 내부에있는 다른 이진 파일에 윈도우를 연기 할 수 있습니다 (가장 일반적인 사용은 통합 32 비트/64 비트 이진이며 프로세스 탐색기는이를 사용하여 실행합니다 예를 들어 32 비트 바이너리에서 64 비트 모드로). – ewanm89

+0

Microsoft는이 기술을 side-by-side 어셈블리라고 부르는 것 같으며 MSDN http://msdn.microsoft.com/en-us/library/ms235531.aspx에 문서화되어 있습니다. 대부분의 설명서는이 문서에서 찾은 것 같습니다. 그것을 사용하여 여러 라이브러리 버전을 캡슐화하는 DLL을 만드는 방법을 참조하십시오. – ewanm89

+0

의견에 감사드립니다. 너는 나를 정답으로 인도했다. – enriquein

답변

2

밝혀졌습니다. dwmapi.dll을 지연시키기 위해 링커에 알릴 수 있습니다.

나는 ewanm89에 감사하고 싶다. 왜냐하면 그는 일종의 공감을해서 실제 답변을 찾는 길을 안내해 주었다.

+1

그래, 내가 잤을 때 나는 당신이 단지 조건에 dll을로드 할 수 있고 두 번째 바이너리가 필요하지 않은지 궁금했다. – ewanm89

+1

잤다! 인상적. –

1

일반적인 해결책은 LoadLibrary() 및 GetProcAddress()를 사용하는 것입니다. 둘 다 프로그램을 시작한 후에 수행 할 수 있습니다. 하지만 DelayLoad 솔루션의 경우 여전히 +1을 사용합니다.