C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[11328] BDS2006에서의 GDI+ 충돌문제
김상구.패패루 [peperu] 2222 읽음    2006-01-30 13:36
아... 이것 때문에 거의 이틀을 꼬박 날려버렸네요.
원래 진행중인 프로젝트가 C++Builder 6에서 GDI+를 이용하고 있었습니다.
프로젝트를 BDS2006으로 마이그레이션 하기 위해 그동안 써드파티 컴포넌트 이식작업을 준비해왔고, 이제 본 프로젝트 마이그레이션만 남아 있었는데...
생각치도 않은 GDI+가 발목을 잡아버리네요.
처음에는 GDI+의 초기화 문제일 것이라고 생각을 했지만... 결론은 그것과는 상관이 없는 것 같습니다. 정말 사람 헷갈리게 하는 것은... Matrix를 제외한 다른 기능은 별 이상 없이 되더라는 것이죠. GDI+의 Matrix를 사용하는 경우 문제가 시작되는군요.

클래스 멤버로
Gdiplus::Matrix VP;
뭐 이런식으로 선언을 할 경우 VP가 제대로 초기화 되지 않는 문제가 있습니다.
당연히 이 때문에
Gdiplus::Graphics gp(Canvas->Handle);
Gdiplus::Pen p(Gdiplus::Color::Red);
gp.DrawLine(&p, 0,0,100,100);    // <- 여기까지는 잘 그려집니다.
Gdiplus::Matrix mt;                
if (gp->GetTransform(&mt) != Gdiplus::Ok)
{
  ShowMessage("Error!!");
}

이런 코드를 사용시... 바로 CPU모니터링 창이 뜨면서 에러발생... 에러가 나지 않는 경우도 있었고 간혹 될 때도 있었지만... 암튼 이상합니다. 데이터 얼라인먼트를 4byte로 바꿔도 마찬가지고...

아직까지 해결책을 찾지 못하고 있습니다. 프로젝트는 급하기 때문에 일단 다시 BCB6용으로 변환시켜놓기는 했습니다만... 그래도 성과가 전혀 없는것은 아니라서 마이그레이션 하는 동안 자잔한 버그들도 잡았고 패키지도 다시 정리하고... 그나마 다행입니다.

인터넷에서 관련 정보를 좀 수집해 보는데... 델파이 쪽에서는 별 문제 없는 것 같네요.
BDS2006 개발팀에 좀 이 문제가 알려지면 좋겠는데... 에효...
김상구.패패루 [peperu]   2006-01-30 14:48 X
아씨... 위의 소스대로 만들어서 해 보는데 또 아무 이상 없이 잘 되네요... -_-;;;;
아 짱나...
김상구.패패루 [peperu]   2006-01-30 18:16 X
분명 문제는 있는데... GDI+를 패키지에서 사용하는 경우입니다.
에러는 항상 메모리 얼로케이션이 잘 못 되는 경우... BAADF00D 로 메모리가 할당되서 생기는 문제인데 이게 도데체 어느놈 잘못인지 알 수가 없네요.
가장 의심스러운 부분은 GDI+의 Initialize 시점입니다만... 같은 함수 안에서도 Path같은 객체는 잘 생성되었는데 그 다음 줄의 Pen객체 생성시 위와같은 에러(에러났다고 알려주지도 않아요. 걍 메모리 번지가 BAADF00D로 설정되는걸로 끝)가 발생하는 것으로 봐서는... 암튼 도무지 이해가 안됩니다.
당연히 BCB6에선 아무 문제 없이 잘 되구요.

+ -

관련 글 리스트
11328 BDS2006에서의 GDI+ 충돌문제 김상구.패패루 2222 2006/01/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.