'DLL Hell'에 해당되는 글 1건
2008. 9. 8. 13:55
프로그램을 짜다보면 희안한 그리고 황당한 일을 많이 겪는다.
'VS2005' 에서 간단한 테스트 프로그램을 작성하고 동작을 잘하는 것을 확인하고나서 다른 PC로 실행파일을 옮겨 실행을 시키니 다음과 같은 에러 메시지가 뜬다.
응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다. 이 문제를 해결하려면 응용 프로그램을 다시 설치하십시오.
같은 프로그램을 동일한 OS가 설치된 다른 기계에서 실행이 되지 않는 이런.. XX같은 일이... -_-;;
해결방안을 찾기 위해 구글이며 네이버며.. 여기 저기 뒤진 결과 일단은 해결을 했다.
가장 간단한 방법은 'vcredist_x86.exe'를 에러가 발생하는 PC에 설치를 해주면 된다.
VS2005가 설치된 PC에서 "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86"폴더를 확인하자.
vcredist_x86.exe 라는 파일을 발견할 수 있을 것이다. 이 녀석을 테스트 하려 하는 PC에 설치를 한 뒤 에러가 발생했던 테스트 프로그램을 실행시켜 보면 정상적으로 동작하는 것을 확인 할 수 있다.
혹시... visual studio가 설치 되지 않아 파일을 찾을 수 없는 사람이라면... 아래 파일을 받아서 사용하면 된다.
다른 방법으로는 mfc80.dll, msvcr80.dll 등을 실행파일과 같은 폴더에 복사한 뒤 프로그램을 실행하면 된다고들 하는데.. 본인의 경우에서는 그렇지 않았다. 대신 위에서 설명한 vcredist_x86.exe 를 설치한 뒤에 정상적으로 동작을 하였다.
이런 현상이 발생하는 이유는 다음과 같다.
Windows XP에서는 DLL Hell(새로운 프로그램을 설치할때 다른 프로그램이 사용하는 DLL을 덮어 쓰거나 혹은 버전의 불일치로
오는 문제로 기존의 프로그램들이 제대로 동작하지 않는 경우가 있다.)을 빠져나가려고 Side-by-Side Assembly라는 개념을
만들었다.
이건 여러 버전의 DLL을 동시에 시스템에 존재할 수 있게 해주고, DLL을 사용하는 응용프로그램이 원하는 DLL 버전을 골라서 쓸 수 있도록 해주는 방법이다.
SideBySideAssembly 의 강력한 점은 응용프로그램에서 직,간접적으로 로드하는 모든 DLL이 이 설정의 영향을 받는다는 것이다. 이전에는 응용프로그램이 로드한 DLL에 의해서 간접적으로 로드되는 DLL을 제어할 수 있는 방법이 없었다.
이러한 새로운 방식으로 기존방식대로 VS.NET 라이브러리를 복사하는것으로 끝나지 않고 배포를 위한 별도의 작업이 필요하게 된다.
문제 해결에 대한 페이지
http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary
http://www.codeproject.com/cpp/vcredists_x86.asp
http://cafe.naver.com/solidcode.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=8
DLL hell에 대해 설명한 페이지
http://www.blogin.com/blog/main.php?datX=00693597&keyZ=x8G3zrHXt6G51iDGwQ==
마이크로소프트사의 side by side assemblies에 대한 설명한 페이지
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sbscs/setup/side_by_side_assemblies.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwxp/html/sidexsidewinxp.asp
- 홍가일보 블로그에서 살짝 가져옴... ^^;
이건 여러 버전의 DLL을 동시에 시스템에 존재할 수 있게 해주고, DLL을 사용하는 응용프로그램이 원하는 DLL 버전을 골라서 쓸 수 있도록 해주는 방법이다.
SideBySideAssembly 의 강력한 점은 응용프로그램에서 직,간접적으로 로드하는 모든 DLL이 이 설정의 영향을 받는다는 것이다. 이전에는 응용프로그램이 로드한 DLL에 의해서 간접적으로 로드되는 DLL을 제어할 수 있는 방법이 없었다.
이러한 새로운 방식으로 기존방식대로 VS.NET 라이브러리를 복사하는것으로 끝나지 않고 배포를 위한 별도의 작업이 필요하게 된다.
문제 해결에 대한 페이지
http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary
http://www.codeproject.com/cpp/vcredists_x86.asp
http://cafe.naver.com/solidcode.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=8
DLL hell에 대해 설명한 페이지
http://www.blogin.com/blog/main.php?datX=00693597&keyZ=x8G3zrHXt6G51iDGwQ==
마이크로소프트사의 side by side assemblies에 대한 설명한 페이지
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sbscs/setup/side_by_side_assemblies.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwxp/html/sidexsidewinxp.asp
- 홍가일보 블로그에서 살짝 가져옴... ^^;
아.. 그런데.. 이런 응용프로그램을 만들어 배포할 경우에는 어쩌지? -_-;;
'Programmings > Windows Programming' 카테고리의 다른 글
Windows Power Scheme Management APIs (0) | 2008.09.11 |
---|---|
Windows Power Management Structures (0) | 2008.09.11 |
전원 상태를 알아오는 SYSTEM_POWER_STATUS struct (0) | 2008.09.06 |
Windows Power management API - PBT_APMPOWERSTATUSCHANGE Event (1) | 2008.09.05 |
GetCurrentDirectory()를 이용한 Windows에서 현재경로 받아오기.. (1) | 2008.08.20 |