none
GdiPlus 를 사용하여 만든 버튼이 사라졌다 나타나는 문제 RRS feed

  • 질문

  • 현재 개발 PC 환경:

    윈도우즈7 pro sp1 64Bit

    VS2010 sp1, Intel CPU, 16GB ram

    테스트용 PC의 사양

    윈도우7 pro sp1 64Bit

    Intel CPU, 4GB ram

    개발용 PC에서 bmp, png 파일과 GdiPlus를 사용하여 버튼 디자인을 입혔습니다. 마우스 이벤트로 보통때, 마우스 올라올때, 클릭했을때

    이 세가지 상황에 따른 버튼 디자인이 존재하고 개발용 PC에서는 모든 동작이 정상적으로 작동하고 있습니다.

    하지만 이것을 테스트 용 PC에서 실행할때 문제가 발생합니다.

    BMP 기반 디자인은 괜찮으나 png 기반 디자인은 버튼 디자인이 마우스가 왔다갔다할 때마다  사라졌다 나타나는 것이  반복됩니다.

    이 문제는 해결하기 위해 다양한 버전의 GdiPlus를 실행 폴더에 복사하는 등의 방법을 취해보았으나 소용이 없었고

    유일하게 효과가 있는 방법은 모든 윈도우 업데이트 후 비주얼 스튜디오2010을 전체설치로 하는 방법 뿐이었습니다.

    전체설치를 할 경우 동작은 정상적으로 돌아오지만 모든 테스트 PC에 비주얼 스튜디오를 설치할 수는 없는 일이라 정확히 어떤부분이

    필요한지 알고 싶어서 문의드립니다.


    • 편집됨 twinmoon01 2014년 1월 10일 금요일 오전 8:26
    2014년 1월 10일 금요일 오전 7:47

답변

  • 제가 설명이 좀 어려웠다면, 문제가 재현될 때와 정상적으로 동작할 때, 각각의 상황에서 애플리케이션의 덤프 파일을 떠서 압축하여 대용량 메일 같은 것으로 share해 주신다면 제가 한번 차이를 살펴보도록 하겠습니다.

    Process Explorer나, 작업관리자에서 실행중인 프로세스 항목에 마우스 우클릭 -> Create Process Full Dump 하시면 메모리 덤프 파일이 생성됩니다. 이것을 압축하여 heejunekim@hotmail.com 으로 보내주시면 제가 살펴보도록 하겠습니다.

    2014년 1월 13일 월요일 오후 1:37

모든 응답

  • 시도해 보고 계신 것처럼, gdi+ 버전 차이로 인한 문제로 생각됩니다.

    우선 Process Explorer와 같은 툴을 이용하여 실제 정상적으로 실행중인 프로세스에서 gdiplus.dll의 정확히 어떤 버전이 올라왔는지를 한번 확인해 보시기 바랍니다. 그리고 문제가 재현되는 PC에서도 한번 동일한 방법으로 어떤 버전이 로드되었는지 비교해 보시고요.

    버전 차이가 확인되었다면, app.exe.config와 같이 manifest 파일을 작성하여 특정한 버전의 gdiplus.dll이 로드되도록 지정하여 테스트 해 보시기 바랍니다. 추가정보: http://stackoverflow.com/questions/1381028/winsxs-how-to-take-dependency-on-specific-version-of-gdiplus-dll


    2014년 1월 10일 금요일 오후 1:55
  • 답하여주신 방법대로 GdiPlus가 어느 버전이 사용되었는지 확인해보았는데 둘다 동일한 버전을 사용하고 있었습니다.(6.1.7601.18120)

    이문제를 해결하기 위해 여러가지 방법을 테스트 하던 중 다른 현상이 발견되어 다시 질문 드립니다.

    윈도우(Windows7 Pro)를 재설치 후 서비스팩 1을 설치한 뒤에 몇가지 윈도우 업데이트만을 하였습니다.

    업데이트 내용:

    NetframeWork3.5/4.5 관련 업데이트

    정품인증 업데이트(KB971033)

    GdiPlus 업데이트(KB2834886)

    인터넷익스플로러10

    위 업데이트만을 설치하고 두번의 재부팅을 하니 정상적으로 동작하는 것을 확인하였습니다.

    다시 한번 확인하기 위해 윈도우를 재설치 후 동일한 작업을 반복하였습니다.(단, 업데이트 내용은 같지만 순서는 다릅니다.)

    하지만 이경우에는 문제가 개선되지 않고 그대로 남아있었습니다.

    동일한 방식인데도 한 경우는 문제가 개선되고 한 경우에는 문제가 남아있고.. 좀 이해하기 힘든 상황이라 막막하네요.

    GdiPlus는 여전히 정상 작동시와 같은 버전을 불러오고 있습니다.

    이 상황에서 어떤 것을 확인하는 것이 문제 해결에 도움이 될까요?

     

    2014년 1월 13일 월요일 오후 12:43
  • 매우 답답하실 것으로 생각되네요, 이러한 문제는 참 많이 골치가 아프죠.

    만약 저에게 이 문제가 발생했다면,

    1) 우선 문제가 재현될 때와 정상적으로 실행될 때 실행 바이너리에 차이가 있는지를 검사해 볼것 같습니다. 만약 의존성이 있는 시스템 바이너리 중, 버전이 다른 것을 발견한다면 일단 그것을 의심해 볼 것이고요....

    2) (현재 시나리오에서 가능성이 작긴 하지만) 그러나 동일한 바이너리/버전들이 로드되었는데 문제가 재현되거나, 되지 않는다면 코드의 문제일 가능성이 크므로 문제를 확인해 볼 수 있는 샘플코드만을 따로 뽑아내어서 문제가 재현되는 피시에서 디버깅을 시도해 보아야 할 것입니다...

    프로그램이 실행되는데, gdiplus 뿐만 아니라 여러 시스템 바이너리들이 종속적으로 로드되어 실행되므로 우선 두 애플리케이션의 로드된 바이너리 중에서 버전 차이가 있는 것이 무엇인지 확인해 보았으면 좋겠습니다. 간단하게는 알려드린 Process Explorer와 같은 툴에서 하단의 Dll pane을 참고하여 로드된 os의 시스템 파일들의 버전들/차이점을 확인하면 좋겠고, windbg를 쓰실 줄 안다면, 간단하게 lm 명령어로 모듈들을 덤프하고 lmvm gdiplus와 같이 모듈 상세 정보를 덤프한다면 비교해 볼 수 있을 것입니다..

    한번 이것부터 차이를 확인해 보았으면 좋겠네요.

    

    2014년 1월 13일 월요일 오후 1:34
  • 제가 설명이 좀 어려웠다면, 문제가 재현될 때와 정상적으로 동작할 때, 각각의 상황에서 애플리케이션의 덤프 파일을 떠서 압축하여 대용량 메일 같은 것으로 share해 주신다면 제가 한번 차이를 살펴보도록 하겠습니다.

    Process Explorer나, 작업관리자에서 실행중인 프로세스 항목에 마우스 우클릭 -> Create Process Full Dump 하시면 메모리 덤프 파일이 생성됩니다. 이것을 압축하여 heejunekim@hotmail.com 으로 보내주시면 제가 살펴보도록 하겠습니다.

    2014년 1월 13일 월요일 오후 1:37
  • 감사합니다.

    관련 DLL 불러오는 부분을 확인하여 보았는데 정상작동할 경우와 제대로 작동하지 않을 경우 모두 동일한 버전의 DLL을 불러오는 것을 확인하였습니다.

    덤프파일을 취득한 후 압축하여 보내드렸습니다.


    • 편집됨 twinmoon01 2014년 1월 14일 화요일 오후 1:08
    2014년 1월 14일 화요일 오후 1:07
  • 다음 대응내용 그저께 메일로 보내드렸습니다. 확인 부탁드립니다.

    2014년 1월 17일 금요일 오전 12:09