먼저
함수의 이름이 아래와 같이 나오는것은
네임멩글링과 관련이 있습니다.
0001:00330024 @Businessskinform@TbsBusinessSkinForm@FormKeyDown$qqrrx17Messages@TMessage
0001:00330248 @Businessskinform@TbsBusinessSkinForm@NewAppMessage$qqrr6tagMSGro
예를 들어
class myCls
{
public:
test(int i);
test(String s);
test(int i , int k );
}
위와같이 같은 이름의 함수가 여러개 있다면 어떻게 해야하죠?
똑같이 만들순 없으니 어떻게 분명이 구분을 지어야 하잖아요
그래서 Compiler마다 코드에 있는 것과 다르게, 나름대로의 규칙을 가지고 함수이름을 짓습니다.
그것이 네이멩글링이라고 합니다.
VC++ 랑 CBuilder가 네임멩글링 규칙이 다르기 때문에
VC++ 의 lib가 CBuilder에서 바로 링크가 안되는것이죠
그래서 vc++용 dll을 CBuilder에서 바로 링크되도록 implib.exe같은 유틸이 있는것이구요
------------------------------------------------------------------------------------
둘째로..
Application->OnException 이벤트 핸들러에서 Sender를 이용하여
예외가 발생한 객체를 찾는 코드를 올려주셨는데...
제가 팁에 올린 내용중에 특이사항 등을 보면 ..
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=885
객체를 못찾는 경우에 대해 몇가지 기술해 놓았습니다.
코드에서 Component에서 에러가 나도 위치를 찾도록 되어있습니다.
단지 Component의 Owner가 정해지지 않는경우도 있구
Sender가 에러난 Component가 아닌 Application이 넘어오는 경우가 종종 있습니다.
그럼..
조안 님이 쓰신 글 :
: 또 질문을 드리게 되었습니다.
:
: 저번에 장성호님이 대답해주신대로 맵파일을 작성하여
:
: Access Violation 때의 위치를 찾아내었습니다
:
: 주소를 찾아보니 3301A8 이네요
: 0001:00330024 @Businessskinform@TbsBusinessSkinForm@FormKeyDown$qqrrx17Messages@TMessage
: 0001:00330248 @Businessskinform@TbsBusinessSkinForm@NewAppMessage$qqrr6tagMSGro
:
: 그러면 이사이란 소리겠죠
:
: 이게 폼키다운을 먹을때 나는 에러라는것까지는 이해했는데
:
: 그뒤에 QQRRX17,.... 등은 어떤의미가 있는건가요?
:
:
: if ( Sender)
: {
: if ( Sender->InheritsFrom( __classid( TControl) ) )
: {
: TControl * ctrl= ( TControl * ) Sender;
: while ( ctrl)
: {
: sObj = ctrl->Name+ " -> " + sObj;
: ctrl = ctrl->Parent;
: }
: }
: else if ( Sender->InheritsFrom( __classid( TComponent) ) )
: {
: TComponent * Comp= ( TComponent * ) Sender;
: sObj = Comp->Name;
: if ( Comp->Owner)
: {
: sObj = Comp->Owner->Name + " -> " + sObj;
: }
: }
: }
:
: 위 소스를 추가해서
: 소스상에서 에러가나면 에러가 난 화면이 정확히 다 나오는데..
: 이건 그것도 안되고.. 그냥 바로 Access 만 출력이 되는걸보니.. Sender 가 없는건가..
:
: 컴포넌트에서 에러난거라서 이렇게 되는건가요..?